思路👱♂️
将数组一分为二,子进程计算左半部分,父进程计算右半部分
子进程计算完成后将结果写入管道,父进程等待子进程计算完成后,从管道中获取子进程的计算结果,最后父进程将自己的计算结果与子进程的计算结果相加,就得到了整个数组的和
代码👨💻
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#define N 101
#define READ_END 0
#define WRITE_END 1
// 数组求和
int main() {
pid_t pid;
int fd[2];
int arr[N], i;
// 初始化数组
for (i = 0; i < N; i++) {
arr[i] = i;
}
// 创建管道
if (pipe(fd) == -1) {
fprintf(stderr, "Pipe failed.\n");
return 1;
}
pid = fork();
if (pid < 0) {
fprintf(stderr, "fork failed.\n");
return 1;
}
if (pid == 0) {
// 子进程
close(fd[READ_END]); // 关闭管道的读端
int ans = 0, i;
for (i = 0; i < N / 2; i++) {
ans += arr[i];
}
write(fd[WRITE_END], &ans, sizeof(int));
close(fd[WRITE_END]);// 关闭管道的写端
} else if (pid > 0) {
// 父进程
close(fd[WRITE_END]); // 关闭管道的写端
int right = 0, i;
for (int i = N / 2; i < N; i++) {
right += arr[i];
}
wait(NULL); // 父进程等待子进程执行完毕
int left;
read(fd[READ_END], &left, sizeof(int));
close(fd[READ_END]);// 关闭管道的读端
int sum = left + right;
printf("The Sum is %d\n", sum);
}
return 0;
}