Fork()操作系统。 4喜欢进入输出期待3喜

时间:2016-04-28 06:21:07

标签: fork

for(i=0;i<2;i++)
      if(fork()==0)
          printf("Hi");

我期待3喜,并获得4喜 我将printf编辑为printf("Hi %d %d %d ",i,getpid(),getppid()); 创建的第一个孩子打印两个具有相同I值的hi,即它的pid和父亲的pid也相同。为什么?

1 个答案:

答案 0 :(得分:1)

它非常有趣,看起来答案是输出缓冲。例如,我们有:

#include <unistd.h>
#include <stdio.h>

int main() {
  for(int i=0;i<2;i++) {
    if(fork()==0) {
      printf("Hi %d %d %d\n",i,getpid(),getppid());
    }
  }
}

如果在终端中运行此代码将有3行,但如果我将输出重定向到less,则会有4行!

如果我们在printf()之后刷新缓冲区,问题就会消失:

  // ...
  printf("Hi %d %d %d\n",i,getpid(),getppid());
  fflush(stdout);
  // ...

因为stdout是缓冲的,所以发生了这种情况,所以当进程分叉时,缓冲区仍然没有刷新。

来自man stdout

  

流stderr是无缓冲的。流stdout是   当它指向终端时进行行缓冲。部分线不会   出现,直到调用fflush(3)或exit(3),或打印换行符。   这可能会产生意外结果,尤其是在调试时   输出