【问题标题】:process of executing fork () [duplicate]执行fork()的过程[重复]
【发布时间】:2013-09-25 09:38:39
【问题描述】:

我已经执行了以下代码:

#include<stdio.h>

int main()
{
    printf("hello \t");
    fork();
    fork();

   return 0;
}

输出:hello hello hello hello

这是否意味着fork() 为子进程创建与父进程代码完全相同的副本,除了被执行的fork() 调用被消除?

这让我很困惑,因为我在某处研究过“fork() 从代码的下一行开始执行”。因此,如果这是真的,那么它应该创建 3 个子进程和 1 个父进程,并且应该只打印一次 "hello"

请解决这个问题。

我在 gcc 编译器上运行了这段代码。

【问题讨论】:

    标签: c fork


    【解决方案1】:

    这是因为字符串“hello”存储在父进程的输出缓冲区中。

    printf 在遇到\n 时刷新缓冲区,否则只有在缓冲区已满时才打印输出字符串。

    默认情况下,子进程继承父进程的缓冲区,所以如果缓冲区没有刷新,子进程的缓冲区也包含“hello”。

    如果:

    #include<stdio.h>
    
    int main()
    {
        printf("hello \n");
        fork();
        fork();
    
       return 0;
    }
    

    你只会看到一个“你好”。

    【讨论】:

    • 非常感谢@徐鼎 :)
    【解决方案2】:

    这是因为 printf... 你说使用 printf("hello \n") 以便在换行符之后刷新缓冲区,或者你可以在你的代码中使用 fflush(stdout) 并且输出将只是一个 hello ...

    【讨论】:

      猜你喜欢
      • 2011-06-27
      • 1970-01-01
      • 2015-04-28
      • 2019-02-22
      • 2013-01-14
      • 2014-06-17
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多