简单的代码:
#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()在您的代码中多次调用该错误的答案.