关于fork()的问题

透明金

我试图了解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这是为什么?我的错误在哪里?

更新:

阅读评论后,建议执行以下任一操作

  1. 添加\n到每个printf语句
  2. 或:fflush(stdout);在每个printf语句添加
  3. 或:添加setbuf(stdout, NULL);<----这就是我最终要做的事情:)

更新我的代码后,输出确实为1234。

聚丙烯

printf()输出通常是行缓冲的。因此,当您使用时fork(),新进程也会获取缓冲区的副本。当进程退出时,将刷新整个缓冲区(或在代码中刷新的任何时间或缓冲区变满的任何时候)。因此,你看到一个副本printf的输出一次。

1)您可以在每次printf()通话使用刷新fflush(stdout);

2)或使用\n例如:

  printf("2\n");

另一种方法是通过以下方式禁用缓冲:

setbuf(stdout, NULL);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章