4

考虑以下程序。

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

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

hello  
world 

编译这个程序使用./a.out > output在名为“输出”的文件中给出输出,看起来像这样:

hello  
hello  
world 

为什么会这样?

4

2 回答 2

15

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

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

你可以这样尝试:

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

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

于 2013-08-03T13:15:36.480 回答
3

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

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

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

于 2013-08-03T14:19:47.463 回答