触发注册atexit()
函数
与您的问题相反,atexit()
即使程序尝试向主机环境返回非零终止状态,仍会调用注册的函数。无论给定的值如何,对的调用exit()
或main()
返回的函数都将触发使用 注册的函数。atexit()
例子:
#include <stdlib.h>
#include <stdio.h>
void print_stuff(void)
{
puts("Stuff");
}
int main(void)
{
atexit(print_stuff);
exit(1);
}
这将打印Stuff
,即使1
返回。
技术细节
按照 ISO C 标准,注册的函数在atexit()
被调用后被exit()
调用。以下情况也被定义为调用exit()
(并因此触发用 注册的函数atexit()
):
main()
返回等价于调用exit()
。
在最后一个线程调用之后thrd_exit()
,exit(EXIT_SUCCESS)
被调用。
以下是可能的实现定义的调用来源exit()
:
的默认信号处理程序SIGTERM
。
使用前的默认约束处理程序set_constraint_handler_s()
。
该标准提到了以下情况exit()
以及对注册函数的调用atexit()
被规避:
一个未处理的SIGABRT
或已SIGABRT
完成由注册的函数处理的signal()
. SIGABRT
可以提高abort()
。
呼唤_Exit()
。
呼唤quick_exit()
。
在某些情况下,您实现的宿主环境可能会终止程序而无需调用已注册的函数atexit()
,例如在段错误之后。
关于游戏的退出代码
您选择的退出代码对于游戏来说应该没有太大影响。是的,您不会依赖 shell 脚本来运行游戏并向用户报告错误。对于像 Linux 这样的系统,错误反馈可能以对话框弹出、日志或标准错误的形式更有用。