---管道是半双工的,数据只能向一个方向流动,需要双方通信时,需要建立起两个管道;
---只能用于父子进程或兄弟进程之间(具有亲缘关系的进程)
---单独构成一个独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一个文件系统,并且只存在于内存中。
---数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加到管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。
用read、write即可完成读写。
管道两端可分别用描述字fd[0] 和 fd[1] 来描述,需要注意的是,管道的两端是固定了的任务。
管道也是一种文件,也用close 关闭即可。
管道的局限:
1、只支持单向数据流;
2、只能用于具有亲缘关系的进程之间;
3、管道的缓冲区是有限的(管道制存于内存之中,在管道创建时,为缓冲区分配一个页面的大小)
4、管道所传送的是无格式字节流,这就要求管道的读出方和写入方事先约定好数据的格式,比如多少字节算一个消息等等。
命名管道:
管道应用的一个重大限制是它没有名字,因此只能用于具有亲缘关系的进程间通信,在有名管道提出后,该限制得到了克服。
FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统之中,
管道包括无名管道和有名管道两种,前者用于父进程和子进程之间的通信,后者用于运行于同一台机器上的任意两个进程间的通信。
无名管道由pipe()函数创建:
#include<unistd.h>
int pipe(int fields[2]);