1

我遇到了一些测试代码,这些代码在直接在终端上执行以及将其输出重定向到文件时会给出不同的输出:

# include <stdio.h>
# include <stdlib.h>
int main()
{
     printf("hello\n");
     if(fork() ==0)
     {
            printf("world\n");
     }
}

在终端上的输出是:

abhi@ubuntu:~/Desktop/ad/A1/CC$ ./vb
hello
abhi@ubuntu:~/Desktop/ad/A1/CC$ world

(打印世界后光标仍在闪烁,按回车后显示正常提示。)

在将输出重定向到文件时:

./vb >v.txt
 abhi@ubuntu:~/Desktop/ad/A1/CC$ cat v.txt 
 hello
 hello
 world

据我了解,父母并没有等待它打印hello和返回的孩子。然后孩子应该打印world并且代码应该终止。

我无法理解的是为什么代码在其输出被重定向时表现不同。这是什么原因?

4

1 回答 1

8

当 stdout 被重定向到文件时,它不是行缓冲的。当它是一个 tty 时,它是。因此,当写入 tty 时,printf立即写入 stdout 并且“这就是她写的全部内容”。

但是当stdout被重定向到一个文件时"hello\n"仍保留在stdio缓冲区中。当 you 时fork,两个进程(子进程和父进程)最终都会得到stdio缓冲区的副本,它们会在退出时刷新。


题外话:在我看来o/p,写“输出”是一种非常糟糕的方式——我讨厌一千个太阳的白热强度。

于 2012-05-30T18:54:58.667 回答