分叉让我感到困惑。

8
请问有人能解释一下这段代码是如何工作的吗?
int main()
{
  printf("Hello");
  fork();
  printf("World");
}

打印:
HelloWorldHelloWorld

我的具体问题是,为什么hello会被打印两次。难道不是首先打印hello,然后执行fork()吗?
另外,有时它会打印:
 HelloWorld 
// then the reports....process exited with return value 0..etc etc.. then...//
HelloWorld

为什么会出现这个输出?
3个回答

18
原因是输出被缓冲了。当执行fork时,"Hello"仍在缓冲区中未被输出,因此fork出的进程会从相同的缓冲区开始,包括相同的单词"Hello"。然后,父进程和子进程都输出"World",所以两者的总输出结果都是"HelloWorld"。

4
解决方法是在 fork 之前使用 fflush - Potatoswatter
我想说谢谢,但我猜这违反了社区准则 :) :D - guitar_geek
不,这是一个有效的问题,但它已经被提出过了。这种情况经常发生。 - Erich Kitzmueller

4

补充@ammoQ的答案:

int main()
{
    printf("Hello");
    fflush(stdout);
    fork();
    printf("World");
}

这将帮助您获得预期的结果。


3

Fork会创建进程的副本。在fork发生时,printf()可能被缓冲,此缓冲区将被复制。

这里有一个相当不错的解释: fork()分支比预期多?


1
你好,laser_wizard。看起来你发现了一个重复的问题。在这种情况下,你应该将该问题标记为重复,而不是回答它。 - Philipp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接