我试图理解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");
}
}
Run Code Online (Sandbox Code Playgroud)
当我在纸上描绘时,我画了下面的草图:

所以我认为输出应该是1234.但是,当我运行此代码时,输出为12324.这是为什么?我的错误在哪里?
阅读评论后,建议执行以下任何操作
\n到每个printf语句fflush(stdout);在每个printf语句后添加setbuf(stdout, NULL); <----这就是我最终做的:)更新我的代码后,输出确实是1234.
P.P*_*.P. 11
printf()输出通常是行缓冲的.所以,当你fork(),新进程也获得缓冲区的副本.当进程退出时,整个缓冲区被刷新(或者在代码中刷新或缓冲区变满时随时刷新).因此,你看到一个副本的printf的输出一次.
1)您可以在每次printf()通话后使用冲洗它fflush(stdout);
2)或使用\n例如:
printf("2\n");
Run Code Online (Sandbox Code Playgroud)
另一种方法是禁用缓冲:
setbuf(stdout, NULL);
Run Code Online (Sandbox Code Playgroud)
您的分析几乎是正确的.但是,printf不一定要立即写入文件描述符 - 输出在进程内缓冲.第二个过程fork在放入2缓冲区后进行.第二个和第三个进程都将它放在缓冲区和打印中2.
如果你这样做,printf("2\n")新行字符将强制printf刷新缓冲区,你只会看到一个2.
| 归档时间: |
|
| 查看次数: |
763 次 |
| 最近记录: |