程序出口处的printf flush

时间:2013-06-21 08:06:09

标签: c linux printf

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

我们来看下面的代码:

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

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

我猜这是依赖于平台的,所以让我们选择Linux。

可以使用gcc的{​​{1}}来实现,但标准库将依赖于编译器。我认为这不是它的工作方式。

对文档的任何解释或链接表示赞赏。谢谢。

4 个答案:

答案 0 :(得分:11)

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

请参阅此explanation

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:3)

只是为了扩展trofanjoe的回应:

  

退出会导致程序正常终止。调用atexit函数   反向注册顺序,打开文件刷新,打开流   关闭,控制权返回环境。

  

main 中,return expr等同于exit(expr)。退出了   可以从其他功能调用它的优势

答案 3 :(得分:1)

我的机器上的man stdio(强调添加),运行RHEL 5.8:

  

随后可以通过相同或其他方式重新打开文件   程序执行,其内容被回收或修改(如果可以的话)   在开始时重新定位)。 如果main函数返回到它   原始调用者,或者调用exit(3)函数,所有打开的文件都是   在程序之前关闭(因此刷新所有输出流)   终止。其他程序终止方法,例如abort(3)   不要为正确关闭文件而烦恼。