管道总结

管道分类

  • 匿名管道
  • 命名管道

匿名管道

原理:
  • 匿名管道其本质就是内核缓冲区(内核所划分的一片内存),磁盘上不存在对应的文件;
  • 其大小一般为4K
  • 其实现时使用一个环形队列
特点:
  • 管道具有阻塞的性质。
  • 半双工的通信方式。
  • 适用于亲缘进程间。
管道操作
  • 使用pipe(int pipefd[2])函数, 0读1写
  • 读操作
    • 有数据的情况下:
      • read()函数正常读,返回读出的字节数。
    • 无数据的情况下:
      • 写端全部关闭,read()解除阻塞返回0,相当于读文件达到末尾
      • 没有全部关闭,read()陷入阻塞。
  • 写操作
    • 读端全部关闭
      • 管道破裂,进程被终止,内核给当前进程发SIGPIPE信号。
    • 读端没有全部关闭
      • 缓冲区写满了,write()阻塞。
      • 缓冲区没有写满,write()继续写。
查看缓冲区大小

使用 ulimit -a命令
使用pathconf()函数

命名管道

原理:
  • 在磁盘上产生一个对应的文件,映射到内核缓冲区中。(任何写进磁盘上的pipename,均传到内核缓冲区中去,pipename的大小适中为0);
  • fifo实际上是一个伪文件。
特点:
  • 适用于非亲缘进程(两个无关的进程)。
  • 具有阻塞性质。
  • 半双工的通信方式。
操作方式:
  • 可以使用I/O函数对文件进行操作。
    • read()/write()
    • open()/close()
    • 不可使用lseek()操作。
  • 创建方式。

    • mkfifo命令;
    • mkfifo()函数。

    关闭管道时,要注意管道的文件描述符被连接的数量,防止没有全部关闭,占用系统资源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值