printf在程序出口处刷新

我很想知道程序退出时printf()函数的flush是如何工作的。

我们来看下面的代码:

 int main(int ac, char **av) { printf("Hi"); return 0; } 

在这种情况下, printf()如何设法将其缓冲区刷新到stdout

我想这是平台依赖,所以让我们来看看Linux。

它可以使用gcc__attribute__((dtor))但是标准库将依赖于编译器。 我认为这不是它的工作方式。

任何解释或文件链接表示赞赏。 谢谢。

Solutions Collecting From Web of "printf在程序出口处刷新"

C运行时将注册atexit()处理程序来调用exit()时刷新标准缓冲区。

看到这个解释 。

只是为了扩大trofanjoe的回应:

退出导致正常程序终止。 atexit函数以与注册相反的顺序被调用,打开的文件被刷新,打开的流被关闭,并且控制返回到环境。

main中 ,return expr相当于exit(expr)。 退出具有可以从其他功能调用的优点

当程序正常退出时, exit函数总是执行标准I / O库的干净关闭,这将导致所有缓冲的输出数据被刷新。

从主函数返回一个整数值相当于使用相同的值调用exit。因此, return 0exit(0)具有相同的效果,

如果_Exit_exit被调用,进程将立即终止,IO不会被刷新。

从我的机器上的man stdio (这里强调增加),运行RHEL 5.8:

一个文件可能随后被重新打开,通过相同或另一个程序执行,其内容被回收或修改(如果它可以在开始时重新定位)。 如果主函数返回到原来的调用者,或者调用了exit(3)函数,则在程序终止之前,所有打开的文件都关闭(因此所有的输出流都被刷新)。 其他程序终止的方法,如中止(3)不打扰正确关闭文件。