【发布时间】:2021-06-23 04:19:29
【问题描述】:
我最近阅读了很多关于标准输出缓冲的内容。我知道printf 已缓冲,但到目前为止,我认为它的缓冲区仅在将新行读入缓冲区或调用fflush(stdout) 或调用printf的进程正常退出时才被刷新。
我编写了这个程序,它在scanf 之前没有换行就调用了 printf。当我用谷歌搜索时,我发现很多人说他们不明白为什么 scanf 在 printf 之前执行。由于我现在了解标准输出缓冲的概念,这对我来说很有意义。
但是,就我而言,缓冲区在我运行 scanf 之前被刷新。这样做确实有意义,因为用户可能希望 printf 在任何 scanf 之前执行,但它是如何发生的?究竟什么是刷新标准输出?是scanf吗?
int main(void) {
char things;
printf("Hello ");
scanf("%c", &things);
}
(我正在运行 Arch Linux)
编辑:由于一些 cmets 说我的系统的标准输出是无缓冲的,我只想补充一点,没有在我的程序上运行 scanf,我的程序具有我上面提到的行为,它肯定是缓冲的。
【问题讨论】:
-
Doing
printf("Hello "); sleep(1); scanf("%c", &things);向我展示了确实,使用交互式程序scanf刷新标准输出缓冲区。例如,您可以执行./a.out | cat来查看它是否已缓冲。 ||我认为它在gnu.org/software/libc/manual/html_node/Flushing-Buffers.html 被记录为Whenever an input operation on any stream actually reads data from its file并假设 stdout 和 stdin 都引用同一个“文件”。 -
我刚刚在 docker 的 alpine 上测试了 musl,
Hello被打印出来之后scanf。请注意,行为可能会发生变化,并且刷新缓冲区的是 glibc。
标签: c linux printf scanf buffering