Pipe就是咱们常说的无名管道,是进程间通信方式的一种。在使用pipe进行进程间通信时,需要熟悉他的特点及使用规则。
无名管道具有如下的特点:
1、只能用于具有亲缘关系的进程之间。
2、半双工的通信模式,具有固定的读端和写端。
3、管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数。
4、管道是基于文件描述符的通信方式。当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1]。其中fd[0]固定用于读管道,而fd[1]固定用于写管道。
关于管道在读写的时候需要注意以下几点:
1、读:
(1)有写端,至少有一个进程,有写端存在
有数据:使用read可以读到pipe中的数据,返回实际读取的字节数
无数据:阻塞,等待其他进程向管道写入数据。
(2)无写端,所有进程,写端都关闭了。
有数据:使用read可以读到pipe中的数据,返回实际读取的字节数
无数据:无写端意味着所有的写描述符关闭了,不会向管道中写入数据了,会立刻返回0.
2、写:
(1)有读端,至少有一个进程,读端存在。
有空间:可使用write向管道中写入内容,返回实际写入的字节数。
空间不足:有多少写多少,没写完的阻塞等待,直到其他进程将管道中数据读走,才继续写入数据。
(2)无读端,所有进程,写端都关闭了。
没有读端的时候,想写管道,会得到内核给的SIGPIPE信号。管道破裂。
管道读端不存在的时候,内核是不允许向管道内写入数据的。
Pipe创建之后,在内核中。当所有的读端和写端都关闭的时候,pipe将被释放掉