用C语言编一个程序,创建用于进程间通信的共享内存;使用fork() 函数创建子进程,向共享内存发送“Hello,Iamchildprocess!”信息; 父进程负责从共享内存接收并显示消息,然后撤销共享内存。
时间: 2024-10-18 15:24:44 浏览: 64
在C语言中,我们可以利用`sys/ipc.h`和`sys/shm.h`头文件提供的功能来创建和管理共享内存。以下是一个简单的示例程序,它演示了如何创建共享内存、传递消息以及父进程接收和删除共享内存的过程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define KEY 123456789 // 共享内存的唯一标识符
#define MSG_SIZE 50
int main() {
int shmid; // 共享内存ID
char *msg = "Hello, I am child process!"; // 子进程要发送的消息
pid_t pid;
// 创建共享内存
shmid = shmget(KEY, MSG_SIZE, IPC_CREAT | 0666);
if (shmid == -1) {
perror("shmget failed");
exit(1);
}
// 若需要fork,创建子进程
if ((pid = fork()) == 0) { // 子进程
printf("Child process created.\n");
memcpy(shm_atoi(shmid), msg, strlen(msg) + 1); // 将消息复制到共享内存
printf("Sent message to shared memory: %s\n", msg);
exit(0);
} else if (pid > 0) { // 父进程
printf("Parent process created.\n");
printf("Received message from shared memory: %s\n", shm_atoi(shmid));
// 删除共享内存
shmctl(shmid, IPC_RMID, NULL);
} else {
perror("fork failed");
exit(1);
}
return 0;
}
// 自定义函数,获取共享内存区域的指针
char* shm_atoi(int shmid) {
void *ptr = shmat(shmid, NULL, SHM_RDONLY);
if (ptr == (void *)-1) {
perror("shmat failed");
exit(1);
}
return ptr;
}
```
在这个程序中,我们首先创建了一个共享内存区,然后在子进程中将消息写入。父进程通过`shm_atoi()`函数获取该区域并读取内容。最后,父进程在完成接收任务后删除共享内存。
阅读全文