pipe道缓冲区大小是4k还是64k?
我读了多个地方,pipe道的默认缓冲区大小是4kB(例如, 在这里 ),我的ulimit -a
倾向于确认该语句:
$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 15923 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 // 8 * 512B = 4kB POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 1024 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
但是,当我使用一个小程序来testing缓冲区大小(通过写入pipe道,直到write()块),我看到一个64kB的限制!
看到这个程序:
#include <stdio.h> #include <unistd.h> #include <limits.h> int main(void) { int tube[2]; char c = 'c'; int i; fprintf(stdout, "Tube Creation\n"); fprintf(stdout, "Theoretical max size: %d\n", PIPE_BUF); if( pipe(tube) != 0) { perror("pipe"); _exit(1); } fprintf(stdout, "Writing in pipe\n"); for(i=0;; i++) { fprintf(stdout, "%d bytes written\n", i+1); if( write(tube[1], &c, 1) != 1) { perror("Write"); _exit(1); } } return 0; }
其输出:
$ ./test_buf_pipe Tube Creation Theoretical max size: 4096 Writing in pipe 1 bytes written 2 bytes written 3 bytes written 4 bytes written [...] 65535 bytes written [blocks here]
它强烈build议pipe道缓冲区大小实际上是64k! 这里发生了什么?
其他答案告诉你,pipe道大小是64 KB。 PIPE_BUF为4KB的原因是PIPE_BUF是写保证为primefaces的最大尺寸。 请参阅http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html
现在是可编程的
从Linux 2.6.35开始,可以使用fcntl(2)和F_SETPIPE_SZ
操作将pipe道缓冲区设置为/proc/sys/fs/pipe-max-size
。 这是默认的1 MB; 参见proc(5)。
以我的经验来看,单写testing产生的总大小为65536,但是当我一次写2700时,我只能写16次,然后下一次尝试失败。 我认为“primefaces”写需要在一个4K块内,而且对于我的每个写操作,它都会进入下一个满块以满足请求。 所以,实际上,可用的pipe道尺寸取决于写入的大小。
看起来内核使用多达16个缓冲区,总计达64k。 请参阅此链接以获取ulimit输出与实际缓冲区大小的解释
那就对了。 自2.6.11内核以来,Linux中的pipe道大小为64kB。 为什么ulimit报告为4Kb,我不确定,但那是错误的。