使用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之前打印字符串。