1.无名管道pipe

版权声明:guojawee https://blog.csdn.net/weixin_36750623/article/details/83340360

1.管道创建后的示意图

管道创建之后,相当于Linux内核中的缓冲区(也相当于是打开了一个文件,只不过该文件存放在Linux中的内核缓冲区)

在这里插入图片描述

2.父子进程管道通信图示

  1. 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道
  2. 管道只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信;通常,一 个管道由同一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道。

在这里插入图片描述

3.管道的读写规则

  1. 当没有数据可读时
    O_NONBLOCK disable:read调用阻塞,一直等到有数据来到为止。
    O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。
  2. 当管道满的时候
    O_NONBLOCK disable: write调用阻塞,直到有进程读走数据
    O_NONBLOCK enable:调用返回-1,errno值为EAGAIN
  3. 写关闭–>read | 读关闭—>write
    如果所有管道写端对应的文件描述符被关闭,则read返回0
    如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE
  4. 写入数据量与PIPE_BUF—>原子性
    当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。
    当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。

猜你喜欢

转载自blog.csdn.net/weixin_36750623/article/details/83340360