为什么这个程序用fork打印两次?

时间:2017-03-09 08:25:31

标签: c fork

根据我对fork()的理解,这应该打印出“Hello,World!”一次,因为在调用fork之前只有一个进程。但是,它会打印两次。奇怪的是,如果我在字符串中添加\n或使用puts()而不是printf(),则只打印一次。

#include<unistd.h>
#include<stdio.h>

int main() {
    printf("Hello, World!");
    fork();
}

3 个答案:

答案 0 :(得分:4)

缓冲

由于默认情况下系统上的标准输出是缓冲的,因此不会立即打印。但是,在退出进程之前,将刷新缓冲区。

由于fork复制父项的整个内存空间,文件描述符状态等,它还会复制需要打印的缓冲数据。

因此,除非在分叉之前显式刷新标准输出缓冲区(通过将\n附加到输出或调用fflush(stdout);),否则两个进程都将具有缓冲输出以进行打印。

答案 1 :(得分:2)

我可以提供的解释:

printf("Hello, World!");不会立即打印,因为输出未刷新为stdout

fork()复制进程内存时,它复制内部缓冲区,当两个进程都终止时,两个进程刷新缓冲区并输出文本两次。

答案 2 :(得分:2)

输出到stdoutprintf写入输出的位置)默认行缓冲。这意味着当您打印换行符(或缓冲区已满)时,它的缓冲区将被刷新(并实际写入输出)。

如果不打印换行符,则子进程将复制缓冲的输出,并且当进程结束时,父进程和子进程都将刷新自己的缓冲区,从而导致打印两个输出。 / p>