Ich habe an mehreren Stellen gelesen, dass die Standardpuffergröße für eine Pipe 4 KB beträgt (z. hier), und meine ulimit -a
neigt dazu, diese Aussage zu bestätigen:
$ 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
Aber wenn ich ein kleines Programm verwende, um die Puffergröße zu testen (indem ich in die Pipe schreibe, bis das write() blockiert), sehe ich eine Grenze von 64 kB!
Siehe dieses Programm:
#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;
}
Und seine Ausgabe:
$ ./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]
Es deutet stark darauf hin, dass die Pipe-Puffergröße tatsächlich 64 KB beträgt! Was passiert hier??
Diese Frage ist jetzt zwei Jahre alt und die betreffende Größe ist jetzt programmierbar: stackoverflow.com/a/13906354/140740
– DigitalRoss
16. Dezember 2012 um 23:17 Uhr