【发布时间】: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