关于fork()的问题

luc*_*old 12 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");
   }
}
Run Code Online (Sandbox Code Playgroud)

当我在纸上描绘时,我画了下面的草图:

在此输入图像描述

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

更新:

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

  1. 添加\n到每个printf语句
  2. 或者:fflush(stdout);在每个printf语句后添加
  3. 或者:添加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)

  • 我觉得你的意思是'fflush(stdout)`? (2认同)

zch*_*zch 6

您的分析几乎是正确的.但是,printf不一定要立即写入文件描述符 - 输出在进程内缓冲.第二个过程fork在放入2缓冲区后进行.第二个和第三个进程都将它放在缓冲区和打印中2.

如果你这样做,printf("2\n")新行字符将强制printf刷新缓冲区,你只会看到一个2.