编写一个程序,建立一个管道。父进程生成两个子进程,p1和p2,两个子进程分别向管道中写入各自的字符串,父进程读出它们。(p1写:child process P1,p2写:child process P2)
时间: 2024-10-25 10:06:07 浏览: 16
进程的管道通信编制一段程序,实现进程的管道通信,使用系统调用pipe()建立一个管道文件;两个子进程P1和P2
5星 · 资源好评率100%
在Unix/Linux环境下,可以使用`pipe()`函数和`fork()`函数来创建管道并实现在父进程中启动两个子进程通信。这里给出一个简单的C语言示例:
```c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#define BUFFER_SIZE 100
int main() {
int pipefd[2]; // 定义一个管道描述符数组
pid_t p1, p2; // 子进程PID
// 创建管道
if (pipe(pipefd) == -1) {
perror("Failed to create pipe");
exit(EXIT_FAILURE);
}
// Fork两次,一次为每个子进程
p1 = fork();
if (p1 < 0) {
perror("Failed to fork P1");
exit(EXIT_FAILURE);
}
if (p1 == 0) { // 子进程P1
char message[] = "child process P1";
write(pipefd[1], message, strlen(message)); // 向管道写入数据
printf("Child P1 wrote to pipe and exiting...\n");
exit(0);
}
p2 = fork();
if (p2 < 0) {
perror("Failed to fork P2");
exit(EXIT_FAILURE);
}
if (p2 == 0) { // 子进程P2
char message[] = "child process P2";
write(pipefd[1], message, strlen(message));
printf("Child P2 wrote to pipe and exiting...\n");
exit(0);
}
// 父进程
close(pipefd[1]); // 父进程关闭写端
char buffer[BUFFER_SIZE];
read(pipefd[0], buffer, BUFFER_SIZE); // 从管道读取数据
printf("Parent received: %s\n", buffer);
// 关闭读端
close(pipefd[0]);
wait(NULL); // 等待两个子进程结束
return 0;
}
```
这个程序首先创建一个管道,然后通过`fork()`两次,每次fork后进入一个新的子进程。第一个子进程(P1)和第二个子进程(P2)分别向管道写入他们的消息,而父进程关闭了写端,打开读端,读取并打印出两条消息。
运行此程序后,你应该能看到"Parent received: child process P1"和"Parent received: child process P2"这样的输出。
阅读全文