我很想知道程序退出时printf()
函数的flush如何工作。
我们来看下面的代码:
int main(int ac, char **av)
{
printf("Hi");
return 0;
}
在这种情况下,printf()
如何设法将其缓冲区刷新为stdout
?
我猜这是依赖于平台的,所以让我们选择Linux。
可以使用gcc
的{{1}}来实现,但标准库将依赖于编译器。我认为这不是它的工作方式。
对文档的任何解释或链接表示赞赏。谢谢。
答案 0 :(得分:11)
在调用atexit()
时,C运行时将注册exit()
个处理程序以刷新标准缓冲区。
请参阅此explanation。
答案 1 :(得分:3)
当程序正常退出时,exit
函数始终执行标准I / O库的干净关闭,这会导致刷新所有缓冲的输出数据。
从main函数返回一个整数值相当于使用相同的值调用exit。因此,return 0
与exit(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) 不要为正确关闭文件而烦恼。