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