使用pipe()实现兄弟进程间通信·,父进程利用wait函数负责回收两个兄弟进程,兄进程作为读端关闭写端;弟进程作为写端关闭读端并给兄进程发送一消息“hello,brother”
时间: 2024-03-09 11:45:06 浏览: 59
进程间通信,通过Pipe管道实现
好的,这是一个关于进程间通信的问题。我可以回答你这个问题。
首先,你需要使用 `pipe()` 函数创建一个管道。管道是一个半双工的通信通道,它允许两个进程之间进行通信。在这个问题中,我们需要父进程创建一个管道,并创建两个子进程,每个子进程都可以通过管道与另一个进程通信。
下面是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main() {
int fd[2]; // 管道文件描述符数组
pid_t pid1, pid2; // 两个子进程的进程ID
char buf[100]; // 缓冲区
// 创建管道
if (pipe(fd) < 0) {
perror("pipe error");
exit(1);
}
// 创建第一个子进程
if ((pid1 = fork()) < 0) {
perror("fork error");
exit(1);
} else if (pid1 == 0) { // 子进程1
close(fd[0]); // 子进程1关闭读端
char *msg = "hello, brother";
write(fd[1], msg, strlen(msg)); // 子进程1写入消息到管道
close(fd[1]); // 子进程1关闭写端
exit(0);
} else { // 父进程
// 创建第二个子进程
if ((pid2 = fork()) < 0) {
perror("fork error");
exit(1);
} else if (pid2 == 0) { // 子进程2
close(fd[1]); // 子进程2关闭写端
close(fd[0]); // 子进程2关闭读端
exit(0);
} else { // 父进程
close(fd[1]); // 父进程关闭写端
wait(NULL); // 父进程等待第一个子进程结束
read(fd[0], buf, sizeof(buf)); // 父进程从管道中读取数据
printf("Received message: %s\n", buf); // 打印消息
wait(NULL); // 父进程等待第二个子进程结束
close(fd[0]); // 父进程关闭管道读端
exit(0);
}
}
}
```
上面的代码中,我们使用 `pipe()` 函数创建了一个管道,然后创建了两个子进程。第一个子进程向管道写入消息,第二个子进程不做任何操作。父进程关闭了管道的写端,并等待两个子进程结束后关闭读端。
注意,父进程在读取管道数据时可能会被阻塞,因为只有在管道中有数据可读时才能成功读取。如果你想要避免阻塞,可以使用非阻塞模式或者使用 `select()` 函数来检查管道是否有数据可读。
希望这个例子可以帮助你理解进程间通信的实现。如果你有任何问题,请随时问我。
阅读全文