【问题标题】:Why printf() does not output to a file, when stdout is redirected to that file?当 stdout 被重定向到该文件时,为什么 printf() 不输出到该文件?
【发布时间】:2017-01-25 19:38:30
【问题描述】:

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

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

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

构建并运行它,“Hello World”将打印在终端中:

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

但是如果stdout被重定向到一个文件,运行一段时间后,文件中仍然没有:

$ ./a.out > log.txt
^C
$ cat log.txt
$

为什么printf 不输出到stdout 重定向到的文件?

【问题讨论】:

  • 当然可以,但你没有冲洗它。
  • 行缓冲(因此,刷新每一行)或完全无缓冲的内容在许多平台上是自动转到 TTY 而不是转到文件。
  • 正确,发送 SIGTERM 不会导致自动刷新。
  • 请参阅gnu.org/software/libc/manual/html_node/… 了解 glibc 关于这一点的文档。引用: 请注意,当进程终止时,流不会自动刷新;请参阅 Streams 上的 I/O。
  • @NanXiao, ...在 SIGTERM 的情况下,如果用户希望程序退出,那么大概他们(1)希望它尽快完成退出(不等待刷新缓冲区的时间可能很长),以及(2)不关心它的输出(因为如果他们想要输出,为什么要提前终止它?)

标签: c


【解决方案1】:

默认情况下仅适用于终端,它是行缓冲区。在这里,您将标准输出重定向到文件。所以,现在标准输出没有指向终端。它指向一个文件。对于文件,默认情况下是完全缓冲的。所以,你在写完标准输出后就刷新了它。

请参阅此question 的答案。

正如@js1所说,你必须在写完之后调用fflush(stdout)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-17
    • 2012-06-16
    • 2014-07-22
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多