2.用C语言编一个程序,创建用于进程间通信的共享内存;使用fork() 函数创建子进程,向共享内存发送“Hello,Iamchildprocess!”信息; 父进程负责从共享内存接收并显示消息,然后撤销共享内存。
时间: 2024-10-27 08:08:08 浏览: 84
在C语言中,可以利用`sys/ipc.h`和`sys/shm.h`头文件提供的功能来创建和管理共享内存区,以及`fork()`函数来实现进程间的通信。下面是一个简单的示例程序,展示了如何完成这个任务:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define KEY 12345 // 共享内存的键值
#define SIZE 64 // 字符串大小
int main() {
int shmid;
char *msg = "Hello, I am child process!"; // 子进程将发送的消息
pid_t pid;
// 创建共享内存区域
if ((shmid = shmget(KEY, SIZE, IPC_CREAT | SHM_RDONLY)) < 0) {
perror("shmget");
return 1;
}
// 父进程获取共享内存
char shared_mem[SIZE];
if (shmat(shmid, NULL, 0) == (void*) -1) {
perror("shmat");
return 1;
}
// 接收并显示消息(假设是读取操作)
printf("Parent received: %s\n", shared_mem);
// 撤销共享内存
if (shmdt(shared_mem) == -1) {
perror("shmdt");
return 1;
}
shmctl(shmid, IPC_RMID, NULL); // 删除共享内存区域
// 子进程部分
if ((pid = fork()) == 0) { // 如果是子进程
msg = "Hello, I am parent process!"; // 修改消息内容
if (shmctl(shmid, IPC_SET, NULL) != -1) { // 设置共享内存的内容
if (shmat(shmid, NULL, 0) == (void*) -1) {
perror("shmat");
return 1;
}
strcpy(shared_mem, msg);
printf("Child sent: %s\n", shared_mem); // 显示发送的信息
} else {
perror("shmctl");
return 1;
}
exit(0); // 现在可以退出子进程
}
// 等待子进程结束
wait(NULL);
return 0;
}
```
这个程序首先创建了一个共享内存区域,然后父进程和子进程分别尝试访问它。子进程会改变共享内存的内容,然后父进程会读取并显示收到的消息。
注意,这只是一个基本示例,实际应用中需要处理更多错误情况,并确保正确同步对共享内存的修改。
阅读全文