编写程序shm.c,父进程创建两个子进程p1和p2,p1通过共享内存将1、2、3、…、10依次
时间: 2023-10-21 10:02:04 浏览: 233
进程间共享存储区通信机制的使用
shm.c程序的编写如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
// 创建共享内存的key值
key_t key = IPC_PRIVATE;
// 创建共享内存
int shmid = shmget(key, sizeof(int) * 10, IPC_CREAT | 0666);
if (shmid == -1) {
perror("shmget");
exit(1);
}
// 将共享内存连接到当前进程的地址空间
int *shmaddr = (int *)shmat(shmid, NULL, 0);
if (shmaddr == (void *)-1) {
perror("shmat");
exit(1);
}
// 创建子进程p1
pid_t p1 = fork();
if (p1 == -1) {
perror("fork");
exit(1);
}
if (p1 == 0) {
// 子进程p1写入数据到共享内存
for(int i = 0; i < 10; i++) {
shmaddr[i] = i + 1;
}
exit(0);
}
// 创建子进程p2
pid_t p2 = fork();
if (p2 == -1) {
perror("fork");
exit(1);
}
if (p2 == 0) {
// 子进程p2读取共享内存中的数据并输出
for (int i = 0; i < 10; i++) {
// 等待p1写入数据完毕
while (shmaddr[i] == 0) {
sleep(1);
}
printf("%d ", shmaddr[i]);
}
printf("\n");
exit(0);
}
// 等待子进程p1和p2执行完毕
waitpid(p1, NULL, 0);
waitpid(p2, NULL, 0);
// 分离共享内存
if (shmdt(shmaddr) == -1) {
perror("shmdt");
exit(1);
}
// 删除共享内存
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
perror("shmctl");
exit(1);
}
return 0;
}
```
在这个程序中,首先创建了一个共享内存,共享内存的大小为整型数组int[10]的大小。然后通过`fork()`函数创建了两个子进程p1和p2。子进程p1负责将1到10的数字依次写入到共享内存中,子进程p2负责从共享内存中读取数据并输出。
在子进程p1中,通过一个循环将1到10的数字依次存储到共享内存的数组中。
在子进程p2中,首先使用`sleep(1)`等待子进程p1将数据写入共享内存,然后通过循环从共享内存中读取数据,并输出到屏幕上。
最后,父进程通过`waitpid()`函数等待子进程p1和p2执行完毕,然后分离并删除共享内存。
这样,通过共享内存的方式,子进程p1将1到10的数字依次写入共享内存,子进程p2读取共享内存中的数据并输出。
阅读全文