【问题标题】:Questions on fork() [duplicate]关于 fork() 的问题 [重复]
【发布时间】:2015-01-03 09:44:21
【问题描述】:

我正在尝试理解 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。 这是为什么呢?我的错在哪里?

更新:

看完cmets后,建议做以下任一操作

  1. 将 \n 添加到每个 printf 语句
  2. 或:在每个 printf 语句后添加 fflush(stdout);
  3. 或者:添加 setbuf(stdout, NULL);

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

【问题讨论】:

标签: c fork


【解决方案1】:

printf() 输出通常是行缓冲的。因此,当您fork() 时,新进程也会获得缓冲区的副本。当进程退出时,整个缓冲区被刷新(或者在代码中刷新或者缓冲区变满的时候)。因此,您会再次看到printf 输出的副本。

1) 您可以在每次printf() 调用后使用fflush(stdout); 刷新它

2) 或使用\n 例如:

  printf("2\n");

另一种方法是禁用缓冲:

setbuf(stdout, NULL);

【讨论】:

  • 我想你的意思是fflush(stdout)?
  • @zch 谢谢纠正:)
【解决方案2】:

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

如果您改为使用printf("2\n"),换行符将强制printf 刷新缓冲区,您将只看到一个2。

【讨论】:

  • 好吧,我补充一下\n
猜你喜欢
  • 2013-01-16
  • 2015-01-22
  • 2011-09-22
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 2012-08-11
相关资源
最近更新 更多