管道与FIFO
管道:由于没有名字,只能在有共同祖先(有亲缘关系)的进程间使用。管道普遍用于shell中,也可以在程序中实现子进程向父进程回传信息。
FIFO: 有名管道,可在无亲缘关系的进程间使用。
以上都使用read/write函数访问。
管道
由pipe函数创建,提供一个单向数据流。
#include <unistd.h>
int pipe (int fd[2]);
该函数返回两个文件描述符:
fd[0]:用来读取数据
fd[1]:用来写入数据
管道虽然是单个进程创建的,但是却很少在单个进程内使用。
其典型用途是为两个不同进程(父子进程)提供进程间通信的手段。
当需要一个双向数据流时,我们必须创建两个管道,每个方向一个,步骤如下:
- 创建管道1(fd1[0]和fd1[1])和管道2(fd2[0]和fd2[1]);
- fork创建子进程;
- 父进程关闭管道1的读 fd1[0] 与 管道2的写fd2[1];
- 子进程关闭管道1的写 fd1[1] 与 管道2的读fd2[0];