内容参考自:《Unix网络编程 卷2:进程间通信》
一、管道(pipe)
管道是最初的Unix IPC(interprocess communication, 进程间通信)形式。由于管道没有名字,只能用在有亲缘关系的进程间通信。
1、创建管道
linux为我们提供了pipe()函数来创建管道,函数定义如下:
#include <unistd.h>
int pipe(int pipefd[2]);
//示例:
int pipefd[2]
if(pipe(pipefd) < 0)
printf("Filed to create pipe.");
man pages( 命令$ man pipe)的解释:pipe() 函数创建了一个用于IPC的通道,成功返回0,失败返回-1的同时 errno 会被设置。参数 pipefd 用于返回管道读写端的文件描述符。pipefd[0] 用于从管道中读数据;pipefd[1] 用于将写数据到管道中。系统内核会缓存着写入管道的数据数据,直到这些数据从管道的另一端被读出来。
2、数据接收和发送
read()函数和write()函数对管道进行读写。
//示例
int n;
char buff[1024];
//接收数据
n = read(pipefd[0], buff, MAXLINE)
//发送数据
write(pipefd[1], buff, strlen(buff));
3、例子
定义一个进程通信双方的任务作为例子:客户端从标准输入流中读取一个文件路径名,然后将这个文件路径发送给服务器;服务器读出文件内容,返回给客户端。为了实现二者双工通信且防止冲突,可以创建两个管道来完成父进程和子进程之间的通信。代码实现思路如下:
- 使用pipe函数创建两个管道(pipe1、pipe2);
- 将pipe1的写文件描述符和pipe2的读文件描述符交给父进程;
- 将pipe1的读文件描述符和pipe2的写文件描述符交给子进程;
- 父进程作为客户端将从标准输入流中获取的文件路径写入pipe1,然后从pipe2阻塞地读取数据;
- 子进程作为服务器从pipe1阻塞地读取文件路径后,读取文件内容写入pipe2。
代码如下:
//pipe_test.c
#include <unistd.h> //pipe STDOUT_FILENO open close
#include <sys/types.h> //fork open
#include <fcntl.h> //file controll open
#include <stdio.h> //stdin fgets snptrintf
#include &