关于fork()的问题

时间:2014-11-06 18:42:51

标签: c 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");
   }
}

当我在纸上追踪时,我画了下面的草图:

enter image description here

所以我认为输出应该是 1234。但是,当我运行此代码时,输​​出 12324 为什么?我的错误在哪里?

更新

阅读评论后,建议执行以下任何一项

  1. \n 添加到每个 printf 语句
  2. 或:在每个 printf 声明后添加 fflush(stdout);
  3. 或:添加 setbuf(stdout, NULL); &lt; ----这就是我最终做的事情:)
  4. 更新我的代码后,输出确实是 1234。

2 个答案:

答案 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