使用父子进程实现命名管道的读和写, 实现两个进程的全双工双向实时通信。下面是两个进程的C语言代码
时间: 2024-09-27 14:07:35 浏览: 28
在C语言中,通过父子进程以及系统调用`pipe()`和`fork()`可以创建一个命名管道(FIFO),实现在两个进程之间的全双工双向实时通信。下面是一个简单的示例,展示了如何在父进程中创建管道,并在子进程中分别作为读端和写端进行操作:
**Parent Process (writer):**
```c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#define BUFFER_SIZE 4096
int main() {
int pipe_fd[2]; // 创建管道文件描述符数组
if (pipe(pipe_fd) == -1) {
perror("Failed to create pipe");
exit(EXIT_FAILURE);
}
pid_t child_pid = fork(); // 创建子进程
if (child_pid == 0) { // 子进程
close(pipe_fd[0]); // 关闭写端
dup2(pipe_fd[1], fileno(stdout)); // 将管道的读端连接到标准输出
write(pipe_fd[1], "Hello from Parent", strlen("Hello from Parent")); // 写入数据
printf("Child process exiting...\n");
exit(0);
} else if (child_pid > 0) { // 父进程
close(pipe_fd[1]); // 关闭读端
dup2(pipe_fd[0], fileno(stdin)); // 将管道的写端连接到标准输入
char buffer[BUFFER_SIZE];
read(pipe_fd[0], buffer, sizeof(buffer));
printf("Received message: %s\n", buffer); // 从管道接收数据
wait(NULL); // 等待子进程结束
} else {
perror("Failed to fork");
exit(EXIT_FAILURE);
}
return 0;
}
```
**Child Process (reader)**:
```c
// 这部分代码通常位于父进程中的else if分支之外,因为子进程会自动运行这部分代码
pid_t child_pid = fork();
if (child_pid == 0) { // 子进程
close(pipe_fd[1]); // 关闭写端
dup2(pipe_fd[0], fileno(stdin)); // 将管道的读端连接到标准输入
printf("Child process (reader) started\n");
} else if (child_pid > 0) {
// 父进程无需处理这个分支,因为它已经在上面完成了
} else {
perror("Failed to fork");
exit(EXIT_FAILURE);
}
```