是否保证标准输出在退出前自动刷新?它是如何工作的

Is there a guarantee of stdout auto-flush before exit? How does it work?

本文关键字:何工作 工作 刷新 标准输出 退出 是否      更新时间:2023-10-16

下面是代码(有效的C和c++)

#include <stdio.h>
int main() {
    printf("asfd");
    // LINE 1
    return 0;
}

如果在第1行中放入分段错误表达式,程序将崩溃而不打印任何内容(如预期的那样)。

但是为什么上面的代码打印"asdf"而不退出没有缓冲区被刷新?引擎盖下是什么,为什么它能像预期的那样工作?

这是通过c++语言规范中的这两部分完成的:

[basic.start.main]

main中返回语句的效果是离开main函数并以返回值作为参数调用exit

[lib.support.start.term]

函数exit在本国际标准中具有附加行为:

  • 下一步,所有打开的C流中未写入的缓冲数据被刷新。

一般来说,从main返回不是程序的结束,也不是进入main的开始。

通常,为你的程序创建最终可执行文件的链接器会标记一些位置,比如start,作为开始执行的地方。当操作系统加载您的程序并开始执行它时,它会在这个位置开始执行。这里有设置环境的代码:创建堆栈,设置流状态,等等。然后这段代码调用main

main返回时,它返回到这个特殊代码。然后,该代码执行C或c++程序末尾所需的各种清理工作,如本答案所述。

如果一个程序突然终止,这段最终代码可能不会被执行。

main()退出时,所有打开的流都关闭…包含stdout。关闭打开的流将刷新stdout,并且无论是否使用换行符,都将提交您写入缓冲区的内容。