父进程构建两个子进程,使得有一个子进程结束另一个也结束
时间: 2024-02-28 19:56:40 浏览: 128
父进程创建子进程
5星 · 资源好评率100%
可以使用管道来实现这个需求。首先,父进程创建两个子进程,然后创建一个管道,将管道的写端传递给一个子进程,将管道的读端传递给另一个子进程。当一个子进程结束时,它会关闭管道的写端,另一个子进程会读到管道的 EOF,从而结束运行。
以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
int pipefd[2];
pid_t pid1, pid2;
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
pid1 = fork();
if (pid1 == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid1 == 0) { // 子进程1
close(pipefd[0]); // 关闭管道读端
sleep(5); // 子进程1运行5秒钟后结束
printf("子进程1结束\n");
close(pipefd[1]); // 关闭管道写端
exit(EXIT_SUCCESS);
} else { // 父进程
pid2 = fork();
if (pid2 == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid2 == 0) { // 子进程2
close(pipefd[1]); // 关闭管道写端
while (read(pipefd[0], &pid1, sizeof(pid_t)) > 0) {} // 读取管道直到 EOF
printf("子进程2结束\n");
close(pipefd[0]); // 关闭管道读端
exit(EXIT_SUCCESS);
} else { // 父进程
close(pipefd[0]); // 关闭管道读端
close(pipefd[1]); // 关闭管道写端
waitpid(pid1, NULL, 0); // 等待子进程1结束
write(pipefd[1], &pid1, sizeof(pid_t)); // 向管道写入 EOF
waitpid(pid2, NULL, 0); // 等待子进程2结束
printf("父进程结束\n");
exit(EXIT_SUCCESS);
}
}
}
```
在这个示例中,父进程创建了两个子进程,子进程1会运行5秒钟后结束,子进程2会等待读取管道直到 EOF。当子进程1结束时,它会关闭管道的写端,子进程2会读到管道的 EOF,从而结束运行。注意,父进程需要等待子进程1结束后向管道写入 EOF,否则子进程2会一直等待管道有数据可读,导致程序阻塞。
阅读全文