为什么带有fork()的c程序调用不会创建无限循环?

时间:2018-07-20 15:04:09

标签: c fork

int main(void)
{
   printf("Hello, world! \n");
   fork();
   return 0;
}

为什么只打印两个hello world? 如果在系统执行功能fork()新过程时创建了,是否需要永远打印“ Hello,world!\ n”?

2 个答案:

答案 0 :(得分:6)

在执行程序时,fork创建一个新进程,并在调用fork()时继续执行。

因此,当您到达fork()时,该程序已经调用了printf("Hello, world! \n");,并且父级和子级进程都只是return 0;且程序完成了执行。

如果您只想永久打印“ Hello world”,请执行以下操作:

while(true) {
    printf("Hello, world! \n");
}

如果您想制作叉子炸弹(bad):

while(true) {
    fork();
    printf("Hello, world! \n");
}

我不建议运行此代码,因为它不安全,并且可能会使您的终端机/计算机崩溃。

答案 1 :(得分:6)

该程序应打印一次Hello world。如果仍然打印两次,仍然是因为line buffer没有被清除。
应该清除行缓冲区,因为您的printf中有\n。仍然没有清除它意味着这与您要用来执行代码的平台有关。
您可以通过在fflush(stdout)之后添加printf()来进行验证。

int main(void)
{
   printf("Hello, world! \n");
   fflush(stdout);
   fork();
   return 0;
}