如果我在main中调用fork()会发生什么?

big*_*ong 3 c fork

简单的代码:

#include <stdio.h>
#include <string.h>

main()
{
     printf("Process");
     fork();
     fork();
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据我对fork()的理解,在执行此代码后,我们将有3个子进程和1个父进程.每当我们调用fork()时,执行应该从fork()语句之后的语句开始.因此根据我的说法,"过程"应该只打印一次.但在我的输出过程中正在打印4次.怎么可能?

Yu *_*Hao 10

因为默认情况下标准输出是行缓冲的,所以当您调用时fork(),输出缓冲区将由所有子进程继承.

有几种不同的方法可以改变这种行为:

最后添加一个新的行字符:

printf("Process\n");
Run Code Online (Sandbox Code Playgroud)

或者调用fflush()以刷新输出:

printf("Process");
fflush(stdout);
Run Code Online (Sandbox Code Playgroud)

或使用setbuf()或setvbuf()更改标准输出以不缓冲:

setbuf(stdout, NULL);
printf("Process");
Run Code Online (Sandbox Code Playgroud)

使用任何一种方法,您只会看到输出一次.

注意:请参阅@Dvaid Schwartzatexit()在您的代码中多次调用该错误的答案.

  • 这实际上并没有修复bug.它只是将代码从"有一个可怕的错误导致它做错了"改为"有一个可怕的错误,恰好不会造成运气损害".它解释了他的结果,但不是潜在的问题(atexit处理程序运行四次)也没有告诉他如何解决潜在的问题. (4认同)