用C语言编写程序实现父子进程的管道通信。父进程建立一个管道,其二个子进程P1和P2分别向管道中各写入一句话,父进程分别从管道中读出二个来自子进程的信息并显示之。为使读、写进程互斥地访问pipe文件,需使各进程互斥地访问pipe文件索引结点中的直接地址项。
时间: 2024-09-27 18:08:08 浏览: 22
在C语言中,可以使用`<unistd.h>`和`<sys/types.h>`头文件中的相关函数来实现父子进程间的管道通信。下面是一个简化的示例,展示了如何创建管道、打开管道以及进行读写操作:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#define READ_END 0
#define WRITE_END 1
int main() {
int pipefd[2]; // 创建一个管道,包含两个文件描述符
char msg1[] = "Hello from P1";
char msg2[] = "Hello from P2";
if (pipe(pipefd) == -1) { // 如果管道创建失败,打印错误信息
perror("Failed to create pipe");
return 1;
}
pid_t child1 = fork(); // 创建第一个子进程P1
pid_t child2 = fork(); // 创建第二个子进程P2
if (child1 == 0) { // 子进程P1
close(pipefd[READ_END]); // 关闭接收端
write(pipefd[WRITE_END], msg1, strlen(msg1)); // 向管道写入消息
printf("Child 1 wrote: %s\n", msg1);
exit(0); // 结束子进程
} else if (child1 > 0) { // 父进程
close(pipefd[WRITE_END]); // 父进程关闭写入端
wait(NULL); // 等待P1结束
read(pipefd[READ_END], msg1, sizeof(msg1)); // 从管道读取消息
printf("Parent received from P1: %s\n", msg1);
if (child2 > 0) { // 如果P2存在
close(pipefd[READ_END]);
wait(NULL); // 等待P2结束
read(pipefd[READ_END], msg2, sizeof(msg2));
printf("Parent received from P2: %s\n", msg2);
}
} else { // fork失败,处理错误
perror("Failed to fork");
return 1;
}
close(pipefd[0]); // 关闭未使用的管道读取端
close(pipefd[1]); // 关闭未使用的管道写入端
return 0;
}
```
在这个例子中,我们首先创建了一个管道,并在两个子进程中,一个写入数据,另一个读取数据。为了保证读写过程的互斥性,每个子进程只处理它们各自的任务,而父进程在接收到一个子进程的消息后,再继续等待另一个子进程的消息。