#include <stdio.h>
#include <unistd.h>
int main(void) {
int i = 0;
for (i = 0; i < 4; i++) {
fork();
printf("foo\n");
}
return 0;
}
这会打印“foo”30次。为什么呢?
如果管道输出,为什么它会打印“foo”64次?
$ ./a.out | wc -l
64
答案 0 :(得分:1)
当您调用fork()
时,所有内容都会重复。所以你会在每次迭代中加倍。这就是它打印2 + 4 + 8 + 16 = 30倍的原因。如果您为此流程打印i
的值和PID
,则可以很容易地看到这一点。
正如mch所说,管道将输出缓冲区从缓冲行更改为完全缓冲,因此fork也会复制缓冲区内容。这就是为什么你得到64个打印输出。