管道通信机制
管道 pipe 是进程间通信最基本的一种机制。在内存中建立的管道称为无名管道,
在磁盘上建立的管道称为有名管道。无名管道随着进程的撤消而消失,有名管道则可
以长久保存,shell 命令符| 建立的就是无名管道,而 shell 命令 mkfifo 建立的是有名
管道。两个进程可以通过管道一个在管道一端向管道发送其输出,给另一进程可以在
管道的另一端从管道得到其输入.管道以半双工方式工作,即它的数据流是单方向的.
因此使用一个管道一般的规则是读管道数据的进程关闭管道写入端,而写管道进程关
闭其读出端。管道既可以采用同步方式工作也可以采用异步方式工作。
对“读管道数据的进程关闭管道写入端,而写管道进程关闭其读出端”的理解:
用反证法的思想,假如写管道的进程关闭管道写入端,那么,读管道进程已经不想读管道了,写管道进程还在源源不断地写入数据,那么管道是不是就会太慢而导致“炸裂”?,所以是读管道进程关闭管道的写入端。而写管道的进程关闭读出端,也很好理解,写管道的进程不想写了,它就关闭读出端,读管道进程读完管道中剩余的数据后自然也读不到数据了。
上面这句话的意思是,读管道数据的进程在读数据之前要关闭管道写入端,写管道进程在写数据之前关闭其读出端,在读管道数据的进程读完数据之后,关闭管道的读出端(0端),写管道进程在写完数据之后关闭其写入端(1端)。
匿名管道的局限性主要有两点:一是由于管道建立在内存中,所以它的容量不可能很大;二是管道所传送的是无格式字节流,这就要求使用管道的双方实现必须对传输的数据格式进行约定。
例子:在父子进程之间利