修改以上两个程序sndshm.c和rcvshm.c,使得这两个程序完全实现“实验五”(上一次实验)中利用消息缓冲通信实现的sndfile和rcvfile的功能。
时间: 2023-12-01 17:43:01 浏览: 84
根据提供的引用内容,我们可以得知需要进行以下步骤来修改程序:
1. 修改sndshm.c和rcvshm.c文件,使其实现“实验五”中利用消息缓冲通信实现的sndfile和rcvfile的功能。
2. 使用MASM对修改后的源文件进行汇编,产生Hello.OBJ文件和Hello.LST文件。
3. 若汇编时提示有错,使用文字编辑工具修改源程序后重新汇编,直至通过。
4. 使用LINK将.OBJ文件连接成可执行的Hello.EXE文件。
以下是修改后的sndshm.c和rcvshm.c文件的代码:
sndshm.c:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHMSZ 27
int main()
{
char c;
int shmid;
key_t key;
char *shm, *s;
key = 5678;
if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
perror("shmget");
exit(1);
}
if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
perror("shmat");
exit(1);
}
s = shm;
// 读取文件内容并写入共享内存
FILE *fp;
fp = fopen("file.txt", "r");
if (fp == NULL) {
printf("Error opening file\n");
exit(1);
}
while ((c = fgetc(fp)) != EOF) {
*s++ = c;
}
*s = '\0';
// 标记文件已经读取完毕
*shm = '*';
// 等待接收进程读取共享内存中的数据
while (*shm != '@')
sleep(1);
exit(0);
}
```
rcvshm.c:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHMSZ 27
int main()
{
int shmid;
key_t key;
char *shm, *s;
key = 5678;
if ((shmid = shmget(key, SHMSZ, 0666)) < 0) {
perror("shmget");
exit(1);
}
if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
perror("shmat");
exit(1);
}
s = shm;
// 等待发送进程写入共享内存中的数据
while (*shm != '*')
sleep(1);
// 读取共享内存中的数据并写入文件
FILE *fp;
fp = fopen("file_rcv.txt", "w");
if (fp == NULL) {
printf("Error opening file\n");
exit(1);
}
s++;
while (*s != '\0') {
fputc(*s, fp);
s++;
}
fclose(fp);
// 标记文件已经写入完毕
*shm = '@';
exit(0);
}
```
以上代码实现了利用消息缓冲通信实现的sndfile和rcvfile的功能。sndshm.c将文件内容写入共享内存,rcvshm.c从共享内存中读取数据并写入文件。
阅读全文