根據手冊,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*命令,可以查找到管道容量的最大和最小字節數

管道是由內核管理的一個緩沖區,它的一端連接一個進程的輸出,另一端連接一個進程的輸入。管道的緩沖區不需要很大,它被設計為環形的數據結構,當兩個進程都終止后,管道的生命周期也會被結束
從本質上說,管道也是一種文件,但它又和一般的文件有所不同,管道可以克服使用文件進行通信的兩個問題,具體表現為:
管道是一個固定大小的緩沖區,在Linux中,該緩沖區的大小為一頁,即4kb,使它的大小不會像普通文件那樣不加檢驗的增長。在Linux中,內核使用struct pipe_inode_info結構體來描述一個管道,這個結構體定義在pipe_fs_i.h中。
struct pipe_inode_info結構體

緩沖區的個數:
#define PIPE_BUFFERS (16)
管理緩沖區的結構

新聞熱點
疑難解答