在退出之前是否保证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 ,你写入缓冲区的内容会在有或没有换行的情况下被提交。

Interesting Posts