2.建立一个pipe ,同时父进程生成子进程p1,p2两个子进程分别向管道中写入各自的字符串,父进程读出它们。(参考代码程序2) main()int r p1 p2 fd【2】
时间: 2024-03-09 08:47:04 浏览: 60
进程的管道通信编制一段程序,实现进程的管道通信,使用系统调用pipe()建立一个管道文件;两个子进程P1和P2
5星 · 资源好评率100%
以下是一个示例代码,可以实现父进程创建子进程,子进程向管道中写入数据,父进程从管道中读取数据:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main()
{
int fd[2]; // 管道文件描述符
int r; // 读取字节数
pid_t p1, p2; // 子进程 ID
char buf[100]; // 读取缓冲区
if (pipe(fd) == -1) { // 创建管道
perror("pipe");
exit(1);
}
// 创建子进程 p1
if ((p1 = fork()) < 0) {
perror("fork");
exit(1);
} else if (p1 == 0) { // 子进程 p1
char *msg = "Hello, this is p1."; // 待写入的字符串
close(fd[0]); // 关闭管道读取端
write(fd[1], msg, strlen(msg)); // 向管道写入数据
exit(0); // 退出子进程
}
// 创建子进程 p2
if ((p2 = fork()) < 0) {
perror("fork");
exit(1);
} else if (p2 == 0) { // 子进程 p2
char *msg = "Hi, this is p2."; // 待写入的字符串
close(fd[0]); // 关闭管道读取端
write(fd[1], msg, strlen(msg)); // 向管道写入数据
exit(0); // 退出子进程
}
// 父进程
close(fd[1]); // 关闭管道写入端
// 从管道中读取数据
while ((r = read(fd[0], buf, sizeof(buf))) > 0) {
buf[r] = '\0'; // 在读取的数据末尾添加 '\0' 表示结束
printf("[Parent] Received message: %s\n", buf);
}
// 关闭管道读取端
close(fd[0]);
return 0;
}
```
在这个例子中,我们创建了一个管道 `fd`,然后创建了两个子进程 `p1` 和 `p2`。父进程通过 `fork()` 创建子进程,并在子进程中调用 `write()` 函数向管道中写入数据。父进程则通过 `read()` 函数从管道中读取数据,并在屏幕上输出收到的消息。
需要注意的是,在这个例子中,我们需要在父进程中关闭管道的写入端,否则父进程会一直阻塞在 `read()` 函数中。另外,我们在子进程中关闭了管道的读取端,这是为了防止子进程从管道中读取数据,因为父进程和子进程不能同时从同一个管道中读取数据。
阅读全文