12

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

让我们看下面的代码:

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

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

我想这取决于平台,所以让我们以 Linux 为例。

它可以使用gcc's来实现,__attribute__((dtor))但标准库将依赖于编译器。我认为这不是它的工作方式。

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

4

4 回答 4

11

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

请参阅此说明

于 2013-06-21T08:14:38.700 回答
4

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

从 main 函数返回一个整数值,相当于调用 exit 的值相同。所以,return 0exit(0)

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

于 2013-06-21T08:14:58.330 回答
3

只是为了扩大 trofanjoe 的回应:

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

main中,return expr 等价于 exit(expr)。exit 的优点是可以从其他函数调用

于 2013-06-21T08:25:05.067 回答
1

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

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

于 2013-06-21T08:14:32.233 回答