编写代码完成以下功能: 创建共享内存,写进程通过键盘不断向内存写入“hello world”; 如果结束写操作,则通过键盘输入“end”; 读进程从共享内存读取数据,并打印。直到读到“end”为止。
时间: 2024-05-03 10:17:19 浏览: 253
下面是一个基于Linux的C语言实现,需要使用sys/ipc.h、sys/shm.h、stdlib.h、stdio.h、string.h、unistd.h头文件:
```c
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define SHM_SIZE 1024
#define SHM_KEY 1234
int main()
{
int shmid;
char *shmaddr;
char buffer[SHM_SIZE];
// 创建共享内存
shmid = shmget(SHM_KEY, SHM_SIZE, IPC_CREAT | 0666);
if (shmid == -1) {
perror("shmget");
exit(EXIT_FAILURE);
}
// 连接共享内存
shmaddr = shmat(shmid, NULL, 0);
if (shmaddr == (char *) -1) {
perror("shmat");
exit(EXIT_FAILURE);
}
// 写进程向共享内存写入数据
while (1) {
printf("Please input message: ");
fgets(buffer, SHM_SIZE, stdin);
strncpy(shmaddr, buffer, SHM_SIZE);
if (strncmp(buffer, "end", 3) == 0) {
break;
}
}
// 读进程从共享内存读取数据并打印
while (strncmp(shmaddr, "end", 3) != 0) {
printf("Message from shared memory: %s", shmaddr);
sleep(1);
}
// 分离共享内存
if (shmdt(shmaddr) == -1) {
perror("shmdt");
exit(EXIT_FAILURE);
}
// 删除共享内存
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
perror("shmctl");
exit(EXIT_FAILURE);
}
return 0;
}
```
上面的代码中,我们使用了`shmget`函数创建一个共享内存,参数`IPC_CREAT`表示如果内存不存在则创建,参数0666表示给共享内存设置读写权限。然后我们使用`shmat`函数连接共享内存,返回的指针就是共享内存的首地址。接着我们在写进程中通过`fgets`从键盘读取输入的文本,并使用`strncpy`将其复制到共享内存中。如果输入了"end",则退出写进程循环。在读进程中,我们不断读取共享内存中的数据并打印,直到读取到了"end"为止。最后,我们使用`shmdt`分离共享内存,并使用`shmctl`删除共享内存。
阅读全文