版权声明:guojawee https://blog.csdn.net/weixin_36750623/article/details/83340360
1.管道创建后的示意图
管道创建之后,相当于Linux内核中的缓冲区(也相当于是打开了一个文件,只不过该文件存放在Linux中的内核缓冲区)
2.父子进程管道通信图示
- 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道
- 管道只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信;通常,一 个管道由同一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道。
3.管道的读写规则
- 当没有数据可读时
O_NONBLOCK disable:read调用阻塞,一直等到有数据来到为止。
O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。 - 当管道满的时候
O_NONBLOCK disable: write调用阻塞,直到有进程读走数据
O_NONBLOCK enable:调用返回-1,errno值为EAGAIN - 写关闭–>read | 读关闭—>write
如果所有管道写端对应的文件描述符被关闭,则read返回0
如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE - 写入数据量与PIPE_BUF—>原子性
当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。
当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。