为什么shell和文件之间的输出不同

时间:2013-08-03 13:12:40

标签: c bash unix fork

考虑以下计划。

main() {  
  printf("hello\n");  
  if(fork()==0)  
    printf("world\n");  
  exit(0);  
}  

使用./a.out编译此程序会得到以下输出:

hello  
world 

使用./a.out > output编译此程序会在名为' output'的文件中输出。并且似乎是这样的:

hello  
hello  
world 

为什么会这样?

2 个答案:

答案 0 :(得分:15)

因为输出到shell stdout时通常是行缓冲的,而当你写入文件时,它通常是完全缓冲的。

fork()之后,子进程将继承缓冲区,当你输出到shell时,由于新行\n,缓冲区为空,但是当你输出到文件时,缓冲区仍然是包含内容,并且将在父和子的输出缓冲区中,这就是为什么hello被看到两次。

你可以这样试试:

int main() {  
  printf("hello");    //Notice here without "\n"
  if(fork()==0)  
    printf("world\n");  
  exit(0);  
}  

输出到shell时,您可能会看到hello两次。

答案 1 :(得分:3)

这个答案在余浩的回答之后。他已经解释了很多。

main() {  
  printf("hello\n");  
  fflush(stdout);//flush the buffer
  if(fork()==0)  
    printf("world\n");  
  exit(0);  
}  

然后你就可以得到正确的输出。