使用匿名管道pipe()实现星弟进程间通信,父进程利用wait()函数负责回收两个兄弟进程;兄进程作为读端,利用close()函数关闭写端;弟进程作为写端,利用close()函数关闭读端,并给兄进程发生一个消息“hello,brother”
时间: 2024-03-05 17:50:55 浏览: 90
好的,你的问题是如何使用匿名管道实现星弟进程间通信。下面是一份实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#define MSG_SIZE 64
int main() {
int fd[2];
pid_t pid1, pid2;
char msg[MSG_SIZE] = "hello, brother";
// 创建匿名管道
if (pipe(fd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
// 创建星弟进程
pid1 = fork();
if (pid1 == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid1 == 0) {
// 子进程1
close(fd[1]); // 关闭写端
read(fd[0], msg, MSG_SIZE); // 读取消息
printf("Child 1: %s\n", msg);
exit(EXIT_SUCCESS);
} else {
pid2 = fork();
if (pid2 == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid2 == 0) {
// 子进程2
close(fd[0]); // 关闭读端
write(fd[1], msg, strlen(msg) + 1); // 发送消息
printf("Child 2: %s\n", msg);
exit(EXIT_SUCCESS);
} else {
// 父进程
close(fd[0]); // 关闭读端
close(fd[1]); // 关闭写端
wait(NULL); // 回收子进程1
wait(NULL); // 回收子进程2
exit(EXIT_SUCCESS);
}
}
}
```
这个程序首先创建了一个匿名管道,然后创建了两个子进程,分别作为兄进程和弟进程。兄进程关闭了写端,等待弟进程发送消息;弟进程关闭了读端,发送了一条消息给兄进程。父进程通过`wait()`函数回收了两个子进程。
注意,在发送消息的时候,需要在消息末尾添加一个字符串结束符`\0`,这样接收方才能正确读取消息。在这个例子中,我使用了`strlen()`函数来获取消息的长度,并且将其加一(为了包含字符串结束符)作为`write()`函数的第三个参数。
阅读全文