C 当main()退出时调用另一个函数

C 当main()退出时调用另一个函数,c,main,C,Main,当C中存在main()时,是否可以调用额外的函数 谢谢 您可以注册要在退出main后运行的函数 MSDN已经对如何做到这一点进行了详细说明。基本上,使用atexit注册的函数按与注册时相反的顺序执行。尝试atexit()函数: void myfunc() { /* Called when the program ends */ } int main( int arc, char *argv[] ) { atexit( myfunc ); ... return 0

当C中存在main()时,是否可以调用额外的函数


谢谢

您可以注册要在退出
main
后运行的函数

MSDN已经对如何做到这一点进行了详细说明。基本上,使用
atexit
注册的函数按与注册时相反的顺序执行。

尝试
atexit()
函数:

void myfunc() {
    /* Called when the program ends */
}

int main( int arc, char *argv[] ) {
    atexit( myfunc );
    ...
    return 0;
}

很好的问题和答案。只是旁注。Delphi库中类似功能的滥用导致应用程序在关闭时速度非常慢。

虽然GCC是注册在进程终止时运行的函数的标准,但它提供了一个析构函数*,当
main()
完成或
exit()时,会自动调用函数
已被调用

void __attribute__ ((destructor)) my_fini(void);

*特定于GCC的

atexit()是特定于平台的古怪和不可预测的崩溃的常见原因。例如,OpenBSD手册页建议不要使用它。我在找一些我在2003年左右读到的关于这个主题的文章,但是找不到它们…@asveikau:OpenBSD建议不要使用它,因为退出时会有种族。如果一个单线程OpenBSD程序天真地使用了atexit(),它是否会在退出时遭遇奇怪和不可预测的崩溃?如果是这样的话,这是一个担忧,但我不明白为什么原则上在一个平台上不兼容的函数实现应该意味着不应该在其他平台上使用它。如果你编写多线程代码,那么当然你必须关注你的平台对“隐藏的”全球数据的处理,比如atexit列表…@Steve我希望我能找到关于这个主题的那些老文章,这样我就可以重新回忆起它们的特殊推理。我似乎记得它也适用于其他系统。FWIW,我亲身经历了一些错误,因为调用atexit()时没有意识到处理程序在fork()上保持不变,或者从信号处理程序内部调用exit(),或者在持有锁时调用exit(),或者如果处理程序来自已卸载的共享库。与信号类似,你真的应该小心你的处理程序来自何处以及它是做什么的。我想你可以对如何调用exit不太在意,也可以对如何调用atexit不太在意,但不能两者兼而有之。大多数程序员更喜欢前者。@Steve:即使没有
atexit
,对如何调用
exit
不加注意也是危险的。它不是异步信号安全的,因为它会刷新所有打开的文件,如果您违反调用它的规则,几乎肯定会给您带来问题。