我正在尝试理解fork(),因此我将以下示例放在一起:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
void main()
{
if(fork()==0)
{
printf("2");
if(fork()==0)
{
printf("4");
}
else
{
printf("3");
}
}
else
{
printf("1");
}
}
当我在纸上追踪时,我画了下面的草图:
所以我认为输出应该是 1234。但是,当我运行此代码时,输出 12324 。 为什么?我的错误在哪里?
阅读评论后,建议执行以下任何一项
\n
添加到每个 printf 语句fflush(stdout);
setbuf(stdout, NULL);
&lt; ----这就是我最终做的事情:)更新我的代码后,输出确实是 1234。
答案 0 :(得分:11)
printf()
输出通常是行缓冲的。因此,当您fork()
时,新进程也会获得缓冲区的副本。当进程退出时,整个缓冲区被刷新(或者在代码中刷新或缓冲区变满时随时刷新)。因此,您再次看到printf
输出的副本。
1)您可以使用printf()
fflush(stdout);
来电后刷新它
2)或使用\n
例如:
printf("2\n");
另一种方法是使用以下方法禁用缓冲:
setbuf(stdout, NULL);
答案 1 :(得分:6)
您的分析几乎是正确的。但是,printf
不一定立即写入文件描述符 - 输出在进程内缓冲。将fork
放入缓冲区后,第二个进程执行2
。第二个和第三个进程都将它放在缓冲区中并打印2
。
如果您执行printf("2\n")
,新行字符将强制printf
刷新缓冲区,您只会看到一个2
。