当将stdout重定向到文件时,为什么printf()不会将输出写入该文件?

14

以下是一个简单的C程序:

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

int main(void)
{
        while (1)
        {
                printf("Hello World\n");
                sleep(1);
        }
}

编译并运行它,"Hello World" 将会在终端上打印出来:

构建和运行它,"Hello World" 将会在终端上打印出来:

$ ./a.out
Hello World
Hello World
Hello World

但是如果标准输出被重定向到文件中,运行一段时间后,文件中仍然没有任何内容:

$ ./a.out > log.txt
^C
$ cat log.txt
$
为什么printf没有输出到stdout被重定向的文件中?

13
当然会,但你没有冲洗它。 - Charles Duffy
2
许多平台自动将行缓冲(因此,每行刷新)或直接无缓冲内容发送到TTY,但不会发送到文件。 - Charles Duffy
4
发送 SIGTERM 信号不会自动刷新。 - Charles Duffy
2
@NanXiao,通常情况下,文件I/O的目标是尽可能提高吞吐量。将事物分成许多小写入而不是几个大写入往往会干扰这一目标。 - Charles Duffy
3
@NanXiao,对于SIGTERM的情况,如果用户希望程序退出,则可以推断他们(1)希望它尽快完成退出(而不是等待潜在长时间来刷新缓冲区),并且(2)不关心输出(因为如果他们想要输出,为什么会提前终止它呢?) - Charles Duffy
显示剩余9条评论
1个回答

3
默认情况下,终端只有行缓冲。在这里,您将stdout重定向到文件。所以,现在的stdout不指向终端,而是指向文件。对于文件,默认情况下是完全缓冲的。因此,在写完后必须刷新stdout。
请参考这个问题的答案:question
正如@js1所说,您必须在写完后调用fflush(stdout)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接