有 2 个不同的程序,它们很小,例如:
int main()
{
printf ("print hello");
fork();
}
int main()
{
printf ("print hello\n");
fork();
}
输出 1 是:`print helloprint hello
输出 2 是:print hello
问题是,为什么\n
只有一个打印一次,而第一个打印两次?
您遇到了系统printf
实现的缓冲行为。在第一种情况下,字符串被打印到缓冲区,但由于没有换行符(并且您没有调用fflush
),它只是坐在那个缓冲区中。然后你分叉,当各自的进程退出时,两个分叉的缓冲区都会被刷新。
在第二种情况下,\n
导致缓冲区在分叉之前被刷新,因此当分叉的进程退出时没有剩余的输出。
改变:
printf ("print hello");
fork();
至
printf ("print hello");
fflush(stdout);
fork();
默认情况下,stdout
通常是行缓冲的。在您的示例 2)中,您可以保证stdout
在. Flushing before保证你在.fork
fork
stdout
fork
fork