C语言fork两个子进程并从父进程写入得到管道中读取信息
时间: 2024-05-10 11:20:48 浏览: 157
以下是一个示例代码,展示了如何在父进程中创建两个子进程,并通过管道从父进程中读取信息:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
int fd[2];
pid_t pid1, pid2;
if (pipe(fd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
pid1 = fork();
if (pid1 == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid1 == 0) { // child process 1
close(fd[0]); // close unused read end of the pipe
char *msg1 = "Hello from child process 1!";
write(fd[1], msg1, strlen(msg1) + 1);
close(fd[1]); // close write end of the pipe
exit(EXIT_SUCCESS);
} else { // parent process
pid2 = fork();
if (pid2 == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid2 == 0) { // child process 2
close(fd[0]); // close unused read end of the pipe
char *msg2 = "Hello from child process 2!";
write(fd[1], msg2, strlen(msg2) + 1);
close(fd[1]); // close write end of the pipe
exit(EXIT_SUCCESS);
} else { // parent process
close(fd[1]); // close unused write end of the pipe
char buf[100];
int nbytes = read(fd[0], buf, sizeof(buf));
printf("Received message from child process 1: %s\n", buf);
nbytes = read(fd[0], buf, sizeof(buf));
printf("Received message from child process 2: %s\n", buf);
close(fd[0]); // close read end of the pipe
wait(NULL); // wait for child process 1 to finish
wait(NULL); // wait for child process 2 to finish
exit(EXIT_SUCCESS);
}
}
}
```
该代码使用 `pipe` 函数创建一个管道,然后使用 `fork` 函数创建两个子进程。每个子进程都向管道中写入一条消息,然后退出。
在父进程中,我们关闭了管道的写入端,并从管道中读取两条消息。每个子进程都向管道中写入一条消息,所以我们需要调用 `read` 函数两次来读取这些消息。最后,我们关闭了管道的读取端,并使用 `wait` 函数等待两个子进程退出。
运行该代码,输出应该类似于以下内容:
```
Received message from child process 1: Hello from child process 1!
Received message from child process 2: Hello from child process 2!
```
注意,这些消息的顺序可能不同,因为两个子进程的运行顺序是不确定的。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231045021.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)