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