从本质上说,管道也是一种文件,但他又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题

限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中该换冲区的大小为一页,4k

使得他的大小不像文件那样不加检验的增长。使用固定缓冲区也会带来问题,比如再写管道时可能变满

当这种情况发生时,随后对管道的write()调用被阻塞,等待某些数据被读取,以便腾出足够的空间供

write()调用。

读取工作也可能比写的进程快。当所有进程的数据被读取完时,一个随后的read()调用将默认的被阻塞、

管道变空。这种情况发生时,一个随后的read()调用将被默认的阻塞,等待某些数据被写入,这样就解决了read()

调用将被默认的阻塞,等待某些数据将被写入,这解决了read()调用返回文件结束的问题。

一个管道的容量是有限的。POSIX规定,少于 PIPE_BUF 的写操作必须原子完成:要写的数据应被连续的写到管道;大于 PIPE_BUF 的写操作可能是非原子的: 内核可能会把此数据与其它进程的对此管道的写操作交替起来。POSIX规定PIPE_BUF至少为512B(linux中为4096B),具体的语义如下: 其中n为要写的字节数
n <= PIPE_BUF, O_NONBLOCK无效:原子的写入n个字节。如果管道当前的剩余空间不足以立即写入n个字节,就阻塞直到有足够的空间。
n <= PIPE_BUF, O_NONBLOCK有效:写入具有原子性,如果有足够的空间写入n个字节,write立即成功返回。否则一个都不写入,返回错误,并设置errno为EAGAIN。
n > PIPE_BUF, O_NONBLOCK无效:非原子写。可能会和其它的写进程交替写。write阻塞直到将n个字节写入管道。
n > PIPE_BUF, O_NONBLOCK有效:如果管道满,则write失败,返回错误,并将errno设置为 EAGIN。如果不满,则返回写入的字节数为1~n,即部分写入,写入时可能有其他进程穿插写入。 结论:
1、当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。
2、当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。

最新文章

  1. [No00008D]腾讯通RTX联系方式批量获取
  2. Java日志框架:SLF4J,Common-Logging,Log4J,Logback说明
  3. Divide and conquer:Dropping tests(POJ 2976)
  4. Android仿快递 物流时间轴 的代码实现
  5. JQuery对象操作支持链式法则源码分析
  6. 华为OJ:字符串合并处理
  7. 在 VC6 中使用 GdiPlus-使用
  8. Wireshark抓包分析HTTPS与HTTP报文的差异
  9. shell编程的一些例子4
  10. [Angular 2] Filter items with a custom search Pipe in Angular 2
  11. 第11章 集合、比较和转换(C#入门经典第6版)
  12. 【斗地主技巧】斗地主算法逻辑中的天之道&lt;转&gt;
  13. 六行代码获取本地IP
  14. ASP.NET Core 四种释放 IDisposable 对象的方法
  15. js去重合并
  16. Docker系列05—Docker 存储卷详解
  17. 初学Python——Socket网络编程
  18. 在centos7中安装nodejs(npm )
  19. django之urlresolver
  20. idea下maven项目打包

热门文章

  1. mysql数据库被攻击
  2. ios 开发学习步骤
  3. RDD算子的使用
  4. 阿里云部署SSL证书
  5. Ubuntu下搭建Kubernetes集群(2)--docker基本操作
  6. NAT网络地址转换的原理--笔试答题版
  7. python-下载网页链接
  8. redis 在 windows 中的安装
  9. 微信小程序 - 事件 | 传递 | 冒泡
  10. 【2019.7.16 NOIP模拟赛 T2】折叠(fold)(动态规划)