使用系统调用pipe( )建立一个管道,然后使用系统调用fork( )创建2个子进程p1和p2。这2个子进程分别向管道中写入字符串:“Child process p1 is sending message!”和“Child process p2 is sending message!”,而父进程则从管道中读出来自两个子进程的信息,并显示在屏幕上。
时间: 2024-03-05 13:54:45 浏览: 126
好的,这是一个经典的进程间通信的问题。下面是实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main() {
int pipefd[2];
pid_t pid1, pid2;
char buffer1[100], buffer2[100];
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]); // 关闭管道的读端
char *msg = "Child process p1 is sending message!";
write(pipefd[1], msg, strlen(msg)+1); // 向管道写入信息
close(pipefd[1]); // 关闭管道的写端
exit(EXIT_SUCCESS);
} else { // 父进程
pid2 = fork(); // 创建第二个子进程
if (pid2 == -1) { // 创建子进程失败
perror("fork");
exit(EXIT_FAILURE);
} else if (pid2 == 0) { // 子进程2
close(pipefd[0]); // 关闭管道的读端
char *msg = "Child process p2 is sending message!";
write(pipefd[1], msg, strlen(msg)+1); // 向管道写入信息
close(pipefd[1]); // 关闭管道的写端
exit(EXIT_SUCCESS);
} else { // 父进程
close(pipefd[1]); // 关闭管道的写端
read(pipefd[0], buffer1, sizeof(buffer1)); // 从管道中读取信息
printf("%s\n", buffer1);
read(pipefd[0], buffer2, sizeof(buffer2)); // 从管道中读取信息
printf("%s\n", buffer2);
close(pipefd[0]); // 关闭管道的读端
exit(EXIT_SUCCESS);
}
}
return 0;
}
```
这个程序首先调用pipe( )函数创建了一个管道,然后调用fork( )函数创建了两个子进程p1和p2。每个子进程都向管道中写入一条信息,而父进程则从管道中读取两条信息,并在屏幕上显示出来。
需要注意的是,父进程在读取完信息后需要关闭管道的读端,这样才能保证子进程写入的信息被完全读取,并且在父进程读取完信息后需要关闭管道的写端,这样才能通知子进程写入操作已经完成。
阅读全文