Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18865
  • 博文数量: 2
  • 博客积分: 102
  • 博客等级: 民兵
  • 技术积分: 42
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-08 17:12
文章分类

全部博文(2)

文章存档

2012年(2)

我的朋友

分类: C/C++

2012-08-08 18:03:12

  在windows上写程序的时候,对管道的概念一直不是很清楚。学习linux编程的时候就明白多了,但管道的一些性质还是搞得有点晕,索性就研究一下省得一直迷糊。
  这是我学习的记录和笔记,我当然只记录我不会和我关心的啦~~更多信息查看man 7 pipe。

  根据实验,得到管道这些我以前不明了的信息^_^:
  1。根据手册,linux上的PIPE容量为(capacity)65536个字节;实验得到ubuntu的PIPE_BUF为4096。这里要特别说明的是我看到网上有人将这个Capacity和PIPE_BUF混淆了。我的理解是,Capacity就好比一个桶的容量,是固定的;而PIPE_BUF实在是人为规定出来的一个东东,为什么我这么理解呢?看下面。
  2。要保证write操作是原子操作,一次写入的字节数n就不能超过PIPE_BUF;非阻塞模式下当然还需要有>=n的空余空间,否则写入失败。一次写入大于PIPE_BUF的数据,不管是不是阻塞模式都不保证是原子操作。所以我理解这个PIPE_BUF就是个“规定”,你只能遵守,木有道理。(知识有限,也只能理解到这步了,其实我感觉冥冥之中应该是有道理的......)
  3。非阻塞模式下,能一次性写入的最大数据量就是管道的容量即65536字节了,注意这里的一次性写入是指write不返回的情况下,和原子操作不是一回事。如果写入的更长,也只能写这么多,write函数会返回已写入的长度。
  4。如果写端不存在,读的时候会返回0,代表读到了文件尾。如果读端不存在,写的时候就会产生SIGPIPE信号(忽略此信息的情况下write会返回失败,errno为EPIPE)。

  我还特意写了一个测试程序来和文档给出的说明作对比,对比的结果就是文档说的基本正确下面是代码包.
阅读(1178) | 评论(0) | 转发(1) |
0

上一篇:没有了

下一篇:win7 64位的SSDT

给主人留下些什么吧!~~