③ 设计一个程序实现以下功能: 父进程创建两个子进程,父子进程间通过共享内存实现进程通信。该共享内存为长度为10 的整型数组,子进程1先往共享内存中存放数据1~5,接着子进程2再往共享内存中存放数据6~10,最后由父进程读出所有数据并求和,输出结果。注意父子进程间同步关系的实现。
时间: 2024-02-18 07:06:00 浏览: 125
以下是实现该功能的程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 10
int main() {
pid_t pid1, pid2;
int shmid, *shm, sum = 0;
// 创建共享内存
if ((shmid = shmget(IPC_PRIVATE, SHM_SIZE * sizeof(int), 0666 | IPC_CREAT)) == -1) {
perror("shmget error");
exit(EXIT_FAILURE);
}
// 将共享内存映射到进程的地址空间
if ((shm = shmat(shmid, NULL, 0)) == (int*)-1) {
perror("shmat error");
exit(EXIT_FAILURE);
}
// 创建子进程1
if ((pid1 = fork()) == -1) {
perror("fork error");
exit(EXIT_FAILURE);
} else if (pid1 == 0) {
// 子进程1往共享内存中存放数据1~5
for (int i = 0; i < 5; i++) {
shm[i] = i + 1;
}
exit(EXIT_SUCCESS);
}
// 创建子进程2
if ((pid2 = fork()) == -1) {
perror("fork error");
exit(EXIT_FAILURE);
} else if (pid2 == 0) {
// 子进程2往共享内存中存放数据6~10
for (int i = 5; i < 10; i++) {
shm[i] = i + 1;
}
exit(EXIT_SUCCESS);
}
// 等待两个子进程结束
waitpid(pid1, NULL, 0);
waitpid(pid2, NULL, 0);
// 父进程读出所有数据并求和
for (int i = 0; i < SHM_SIZE; i++) {
sum += shm[i];
}
// 输出结果
printf("sum = %d\n", sum);
// 解除共享内存映射
if (shmdt(shm) == -1) {
perror("shmdt error");
exit(EXIT_FAILURE);
}
// 删除共享内存
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
perror("shmctl error");
exit(EXIT_FAILURE);
}
return 0;
}
```
该程序通过 `shmget` 创建共享内存,然后通过 `shmat` 将共享内存映射到进程的地址空间中。
父进程通过 `fork` 创建两个子进程,子进程1往共享内存中存放数据1~5,子进程2往共享内存中存放数据6~10。
父进程等待两个子进程结束后,读出所有数据并求和,最后输出结果。
在程序结束前,需要通过 `shmdt` 解除共享内存映射,然后通过 `shmctl` 删除共享内存。
阅读全文