管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。管道有如下特质:1.其本质是一个伪文件(实为内核缓冲区),伪文件即不是真正的文件,不占用磁盘空间,其文件描述符为p。另外,s(套接字文件)、b、c均为伪文件;2.由两个文件描述符引用,一个表示读端,一个表示写端。管道的两端各是一个进程,总共两个进程(也可以是一个进程,但是没有意义);3.规定数据从管道的写端流入管道,从读端流出。4.管道没有名字,所以为匿名管道。
管道的原理:管道实为内核使用环形队列(先进先出)机制,借助内核缓冲区(一个页面大小,即4K)实现。
管道的局限性:1.一般数据自己读不能自己写(也可以,但是不会用,没有意义);2. 数据一旦被读走,便不在管道中存在,不可反复读取;3.管道采用半双工通信方式。因此,数据只能在一个方向上流动,但是方向可以改变(全双工在同时可以实现双向通信),需要双方通信,需要提前建立好两个管道(在子进程创建之前);4.只能在有公共祖先的进程(即有血缘关系的进程)间使用管道;5.管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节做一个消息(或命令、记录)等。
常见的通信方式有:单工通信、半双工通信、全双工通信。 单工通信的方向不能改变,且只能沿一个方向通信。
一个进程使用管道的情况。管道从一端fd[1]写入数据,然后从另一端fd[0]读出数据。完事后,关闭文件描述符:close(fd[0]);close(fd[1]); 这样操作是没有任何意义的,因此不用。