在退出之前是否保证stdout自动刷新? 它是如何工作的?
这是代码(有效的C和C ++)
#include int main() { printf("asfd"); // LINE 1 return 0; }
如果在第1行中我放置segfaulting表达式,程序将崩溃而不打印任何东西(如预期的那样)。
但是为什么上面的代码打印“asdf”并且在没有刷新缓冲区的情况下不会被刷新? 什么是引擎盖下的,为什么它按预期工作?
这是通过C ++语言规范中的这两节来完成的:
[basic.start.main]
main
中的return语句具有离开main函数和以返回值作为参数调用exit
的效果。
和
[lib.support.start.term]
函数
exit
在本国际标准中有其他行为:
- …
- 接下来,刷新具有未写入的缓冲数据的所有打开的C流。
- …
通常,从main
返回不是程序的结束,也不是从main
开始。
通常,为程序创建最终可执行文件的链接器会将某个位置(可能名为start
标记为执行开始的位置。 当操作系统加载程序并开始执行它时,它将在此处开始执行。 那里有代码来设置环境:创建堆栈,设置流状态等等。 然后这段代码调用main
。
当main
返回时,它返回到这个特殊代码。 然后,该代码执行C或C ++程序结束时所需的各种清理工作,如本答案中所述 。
如果程序突然终止,则可能不会执行此最终代码。
当main()
退出时,所有打开的流都被关闭……包括stdout
。 关闭打开的流刷新stdout
,你写入缓冲区的内容会在有或没有换行的情况下被提交。