叉子让我很困惑

时间:2014-08-05 14:59:40

标签: c fork

请有人解释一下这段代码是如何工作的吗?

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 个答案:

答案 0 :(得分:18)

原因是:缓冲输出。 "你好"当你执行fork时,它在缓冲区中但尚未被释放,因此forked进程以相同的缓冲区开始,包括相同的单词" Hello"。然后,父母和孩子输出"世界"所以总输出是" HelloWorld"对于他们两个。

答案 1 :(得分:4)

添加到@ammoQ答案:

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

会让你达到预期的效果。

答案 2 :(得分:3)

Fork创建了该进程的副本。并且当fork发生时可以缓冲printf(),这个缓冲区将被复制。

这里非常可靠的解释: fork() branches more than expected?