我试图了解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);
在每个printf语句后添加setbuf(stdout, NULL);
<----这就是我最终要做的事情:)更新我的代码后,输出确实为1234。
printf()
输出通常是行缓冲的。因此,当您使用时fork()
,新进程也会获取缓冲区的副本。当进程退出时,将刷新整个缓冲区(或在代码中刷新的任何时间或缓冲区变满的任何时候)。因此,你看到一个副本的printf
的输出一次。
1)您可以在每次printf()
通话后使用刷新fflush(stdout);
2)或使用\n
例如:
printf("2\n");
另一种方法是通过以下方式禁用缓冲:
setbuf(stdout, NULL);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句