管道容量(转自:http://blog.chinaunix.net/uid-27471192-id-3305880.html)
-
根据手册,linux上的PIPE容量为(capacity)65536个字节;实验得到ubuntu的PIPE_BUF为4096。这里要特别说明的是我看到网上有人将这个Capacity和PIPE_BUF混淆了,当 管道的写端存在时,如果请求的字节数目大于PIPE_BUF,则返回管道中现有的数据字节数,如果请求的字节数目不大于PIPE_BUF,则返回管道中现 有数据字节数(此时,管道中数据量小于请求的数据量);或者返回请求的字节数(此时,管道中数据量不小于请求的数据量)(PIPE_BUF在 include/linux/limits.h中定义,不同的内核版本可能会有所不同。Posix.1要求PIPE_BUF至少为512字节,red hat 7.2中为4096)
-
要保证write操作是原子操作,一次写入的字节数n就不能超过PIPE_BUF;非阻塞模式下当然还需要有>=n的空余空间,否则写入失败。一次写入大于PIPE_BUF的数据,不管是不是阻塞模式都不保证是原子操作
-
非阻塞模式下,能一次性写入的最大数据量就是管道的容量即65536字节了,注意这里的一次性写入是指write不返回的情况下,和原子操作不是一回事。如果写入的更长,也只能写这么多,write函数会返回已写入的长度
-
如果写端不存在,读的时候会返回0,代表读到了文件尾。如果读端不存在,写的时候就会产生SIGPIPE信号(忽略此信息的情况下write会返回失败,errno为EPIPE)
在linux终端输入*man 7 pipe*命令,可以查找到管道容量的最大和最小字节数
-
管道的实现机制:(转自:http://www.th7.cn/system/lin/201702/203314.shtml)
管道是由内核管理的一个缓冲区,它的一端连接一个进程的输出,另一端连接一个进程的输入。管道的缓冲区不需要很大,它被设计为环形的数据结构,当两个进程都终止后,管道的生命周期也会被结束
从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为:
管道是一个固定大小的缓冲区,在Linux中,该缓冲区的大小为一页,即4kb,使它的大小不会像普通文件那样不加检验的增长。在Linux中,内核使用struct pipe_inode_info结构体来描述一个管道,这个结构体定义在pipe_fs_i.h中。
struct pipe_inode_info结构体
缓冲区的个数:
#define PIPE_BUFFERS (16)
管理缓冲区的结构