编写程序父进程分别从管道中读两个来自子进程的信息并显示
时间: 2024-10-08 14:06:26 浏览: 27
在父进程中生成两个子进程,read,write,读写10个随机数
在编写程序时,如果你需要让父进程通过管道(pipe)接收子进程发送的两个独立信息,你可以按照以下步骤在Unix/Linux系统上实现:
1. **创建管道**:
父进程中,使用`pipe()`函数创建一对管道描述符,一个用于写入(`write end`),另一个用于读取(`read end`)。
2. **启动子进程**:
使用`fork()`创建子进程。在子进程中,先关闭写端(通常由子进程使用),然后可以向管道写入信息。写完信息后,子进程退出。
3. **子进程写入管道**:
子进程使用`write()`函数将数据写入到管道的写端,并等待写操作完成。
4. **父进程打开管道**:
父进程通过文件描述符(fd)读取管道,通常会设置非阻塞模式,以便快速检查是否有数据可用。
5. **父进程读取管道**:
父进程调用`read()`或`recv()`函数从管道读取数据,当有数据时,它会接收到这两个独立的信息。
6. **处理和显示信息**:
父进程接收到两个数据后,将其解析并显示出来。
7. **关闭管道**:
父进程在不再需要管道后,记得关闭读端。
```c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#define BUFFER_SIZE 1024
int main() {
int pipe_fds[2]; // 创建管道
if (pipe(pipe_fds) < 0) {
perror("Failed to create pipe");
return -1;
}
pid_t child_pid = fork(); // 创建子进程
if (child_pid == 0) { // 子进程
char data[] = {"信息1", "信息2"};
for (size_t i = 0; i < sizeof(data); i += write(pipe_fds[1], data + i, sizeof(data) - i)) {
if (i != sizeof(data)) {
perror("Failed to write to pipe");
break;
}
}
_exit(0); // 子进程结束
} else if (child_pid > 0) { // 父进程
close(pipe_fds[1]); // 关闭写端
char buffer[BUFFER_SIZE];
ssize_t bytes_read;
while ((bytes_read = read(pipe_fds[0], buffer, BUFFER_SIZE)) > 0) {
// 显示接收到的数据
printf("%.*s\n", (int)bytes_read, buffer);
}
if (bytes_read == -1) {
perror("Failed to read from pipe");
}
close(pipe_fds[0]); // 关闭读端
} else {
perror("Fork failed");
return -1;
}
return 0;
}
```
阅读全文