在linux中编写一个程序,建立一个管道。父进程生成两个子进程,p1和p2,两个子进程分别向管道中写入各自的字符串,父进程读出它们。(p1写:child process P1,p2写:child process P2)
时间: 2024-11-30 10:16:43 浏览: 7
在Linux中,你可以使用`fork()`系统调用来创建子进程,并通过`pipe()`函数来创建管道。以下是简单的步骤:
首先,创建一个父进程(parent),在这个过程中会调用`pipe()`创建一对管道描述符。然后,每个子进程(child)会从父进程通过`fork()`派生出来。
**父进程(parent)代码示例:**
```c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#define BUFFER_SIZE 1024
int main() {
int parent_pipe[2]; // 创建管道
pid_t p1, p2;
if (pipe(parent_pipe) == -1) {
perror("Failed to create pipe");
exit(1);
}
// Fork两次,创建子进程
p1 = fork();
if (p1 < 0) {
perror("Fork error in parent");
exit(1);
}
if (p1 == 0) { // 子进程P1
close(parent_pipe[1]); // 父进程保留write端
write(parent_pipe[0], "child process P1", sizeof("child process P1") - 1); // 写入字符串
_exit(0); // 子进程结束
}
p2 = fork();
if (p2 < 0) {
perror("Fork error in parent");
exit(1);
}
if (p2 == 0) { // 子进程P2
close(parent_pipe[0]); // 父进程保留write端
write(parent_pipe[1], "child process P2", sizeof("child process P2") - 1); // 写入字符串
_exit(0); // 子进程结束
}
// 父进程读取管道内容
char buffer[BUFFER_SIZE];
read(parent_pipe[0], buffer, BUFFER_SIZE);
printf("Parent received from P1: %s\n", buffer);
read(parent_pipe[0], buffer, BUFFER_SIZE);
printf("Parent received from P2: %s\n", buffer);
close(parent_pipe[0]);
wait(NULL); // 等待所有子进程结束
return 0;
}
```
**注意事项:**
1. 父进程负责关闭不需要的管道描述符,确保数据传输的完整性。
2. `wait()`用于等待所有子进程终止,确保程序流程的同步。
阅读全文