【问题标题】:fork is confusing me [duplicate]叉子让我很困惑[重复]
【发布时间】:2014-09-28 07:22:04
【问题描述】:

谁能解释一下这段代码是如何工作的?

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

为什么会有这个输出?

【问题讨论】:

    标签: c fork


    【解决方案1】:

    原因是:缓冲输出。 “Hello”在缓冲区中,但在执行分叉时尚未输出,因此分叉进程从包含相同单词“Hello”的相同缓冲区开始。然后,父母和孩子都输出“World”,所以他们俩的总输出都是“HelloWorld”。

    【讨论】:

    • ... 解决方案是在fflush 之前fork
    • 我想说谢谢 :) 但我猜这违反了社区准则 :) :D
    • 不,这是一个有效的问题,但以前有人问过。无时无刻不在发生。
    【解决方案2】:

    Fork 创建进程的副本。并且 printf() 可能会在分叉发生时被缓冲,这个缓冲区将被复制。

    这里的解释很扎实: fork() branches more than expected?

    【讨论】:

    • 你好激光向导。您似乎发现了一个重复项。在这种情况下,您应该将问题标记为重复而不是回答。
    【解决方案3】:

    添加到@ammoQ 答案:

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

    会让你达到预期的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      相关资源
      最近更新 更多