Linux 管道通信 有P1,P2,P3三个进程,P1和P2负责从键盘接收字符串,均发送给P3
时间: 2023-06-19 20:06:29 浏览: 139
Linux进程间通信之管道
Linux 管道通信可以使用匿名管道来实现。在这个场景中,可以创建两个匿名管道,一个用于P1向P3传递数据,另一个用于P2向P3传递数据。P3则可以从这两个管道中读取数据并进行处理。
以下是一个可能的实现:
```c
#include <stdio.h>
#include <unistd.h>
#define BUFFER_SIZE 1024
int main() {
int p1_to_p3[2]; // 管道1,P1向P3传递数据
int p2_to_p3[2]; // 管道2,P2向P3传递数据
char buffer[BUFFER_SIZE];
// 创建两个管道
if (pipe(p1_to_p3) == -1 || pipe(p2_to_p3) == -1) {
perror("pipe");
return 1;
}
// 创建P1进程
pid_t p1_pid = fork();
if (p1_pid == -1) {
perror("fork");
return 1;
} else if (p1_pid == 0) {
// P1进程
close(p2_to_p3[0]); // 关闭管道2读端
close(p2_to_p3[1]); // 关闭管道2写端
close(p1_to_p3[0]); // 关闭管道1读端
while (1) {
// 从键盘读取字符串
fgets(buffer, BUFFER_SIZE, stdin);
// 向管道1写入数据
write(p1_to_p3[1], buffer, BUFFER_SIZE);
}
}
// 创建P2进程
pid_t p2_pid = fork();
if (p2_pid == -1) {
perror("fork");
return 1;
} else if (p2_pid == 0) {
// P2进程
close(p1_to_p3[0]); // 关闭管道1读端
close(p1_to_p3[1]); // 关闭管道1写端
close(p2_to_p3[0]); // 关闭管道2读端
while (1) {
// 从键盘读取字符串
fgets(buffer, BUFFER_SIZE, stdin);
// 向管道2写入数据
write(p2_to_p3[1], buffer, BUFFER_SIZE);
}
}
// P3进程
close(p1_to_p3[1]); // 关闭管道1写端
close(p2_to_p3[1]); // 关闭管道2写端
while (1) {
// 从管道1读取数据
if (read(p1_to_p3[0], buffer, BUFFER_SIZE) > 0) {
printf("P3 received from P1: %s", buffer);
}
// 从管道2读取数据
if (read(p2_to_p3[0], buffer, BUFFER_SIZE) > 0) {
printf("P3 received from P2: %s", buffer);
}
}
return 0;
}
```
在这个实现中,P1和P2进程都使用了类似的代码来从键盘读取字符串并向管道写入数据。P3进程则使用了类似的代码从两个管道中读取数据并进行处理。由于管道是双向的,因此需要在每个进程中关闭不需要的管道端口。
阅读全文