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

ido*_*ana 1 c fork

int main(void)
{
   printf("Hello, world! \n");
   fork();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么它只打印2个你好世界?如果系统执行函数fork()的外推时间是创建的,则需要永久打印"Hello,world!\n"?

eqw*_*ert 6

执行程序时,fork会创建一个新进程并在您调用的位置继续执行fork().

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

如果你只想永远打印"Hello world",那就做:

while(true) {
    printf("Hello, world! \n");
}
Run Code Online (Sandbox Code Playgroud)

如果你想制作一个叉炸弹():

while(true) {
    fork();
    printf("Hello, world! \n");
}
Run Code Online (Sandbox Code Playgroud)

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


Lea*_*ngC 6

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

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

  • 这是关于stdout重定向,它改变了缓冲模式.我刚刚在linux中编译:`./ a.out` - >一个print,`./ a.out | 更多` - >两张照片.并且所有在线编译器都必须重定向stdout (3认同)