当程序启动时,系统的哪一部分设置了三个标准流的缓冲?
这是 linux 的一部分,还是 glibc,或者可能是 bash?POSIX 是否定义了行为,或者它是 C 的一部分?
Posix 有一些答案:
https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_05
在程序启动时,预定义了三个流并且不需要显式打开:标准输入(用于读取常规输入)、标准输出(用于写入常规输出)和标准错误(用于写入诊断输出)。打开时,标准错误流没有完全缓冲;当且仅当可以确定流不引用交互式设备时,标准输入和标准输出流才被完全缓冲。
因此,如果系统可以确定流不是交互式的,则它们可以被完全缓冲(stderr 除外),但实际上这确定了系统的哪个部分?
你的编程语言
这种行为是 C 运行时库的产物,也是 C 编程语言的要求。历史上,其他编程语言都建立在 C 运行时库之上,并从中获得这种行为。例如,对于 C++ 程序就是如此。Stack Overflow (qv) 上经常引用 C 和 C++ 语言标准的章节和经文。
最值得注意的是,用 Python 编写的程序具有相同的行为,并且经常被问及,有时会归咎于编程语言运行时的行为被严重错误放置。
改变使用默认语言语义(无需修改和重新编译程序)的程序的这种行为的工具有两种形式:依赖于语言(有时是特定于运行时库)的工具,它们将自身插入运行时并更改缓冲,以及将标准 I/O 制作成运行时库决定为交互式设备的文件的工具。后一类中的工具与语言无关,包括 Bernstein
ptybandage
。进一步阅读
只是缓冲问题的几个例子: