IO--管道

2.1 管道的原理

在进程的内核空间中,创建一个管道文件,管道中的数据直接保存在内存中。

0

2.2 管道的特性

  1. 管道可以看成是一个特殊的文件,普通的文件数据存储在外存上,但是管道文件中的内容存储在内存中。
    1. 掉电擦除,
    2. 管道的读写端均关闭后,管道中的数据会被释放。
  2. 管道遵循先进先出的原则,队列的方式实现。
  3. 对于管道的读操作是一次性的,如果对管道进行读操作,被读取的数据会被从管道中删除。
  4. 管道是一种半双工通信方式。
    1. 单工:只能A发消息给B,
    2. 半双工:同一时间,只能A发消息给B或者B发消息给A
    3. 全双工:同一时间,AB能够互相发消息。
  5. 对于管道的操作,只能使用文件IO函数,不能使用标准IO函数,因为需要直接操作内核空间。且不能使用lseek函数。
  6. 管道的大小:65536byte = 64k
  7. 从管道中读取数据
    1. 管道的写端存在
      1. 当管道中没有数据的时候,read函数会阻塞;
      2. 当管道中有10个数据,只读取5个,问实际读取5个
      3. 当管道中有5个数据,读取10个,问实际读取5个。
    2. 管道的写端不存在(父子进程均关闭写端)
      1. 若管道中还有数据,则先将所有数据读取完毕、
      2. 数据读取完毕后,read函数不会阻塞,且立即返回0.
  8. 向管道中写入数据
    1. 管道的读端存在
      1. 当管道写满后,write函数会阻塞。
    2. 管道的读端不存在(父子进程均关闭读端)
      1. 当读端不存在,进程只要调用write函数,写入数据会造成管道破裂,该进程会收到SIGPIPE信号。
      2. SIGPIPE信号(管道破裂信号)会导致进程退出。

        2.3 无名管道(pipe)

        1)无名管道的特点

      3. 顾名思义,没有名字的管道文件,即在文件系统中不可见的管道文件。所以无法用open函数打开。
      4. 无名管道只能用于具有 亲缘 关系的进程间通信。
        1. 若想要实现进程间通信,则进程间需要操作同一根管道
        2. 但是无名管道在文件系统中不可见,所以无亲缘关系的进程无法拿到同一根管道的读写端。
        3. 而子进程会拷贝父进程的用户空间,包括文件描述符表,所以父子进程之间可以拿到同一根管道的读写端。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值