C退出代码和实时/非批处理应用程序中的atexit()

时间:2015-08-06 19:45:12

标签: c error-handling exit exit-code atexit

我正在编写一个游戏,其中许多不同的条件都可能导致失败,例如图像或着色器无法加载,OpenGL无法获得有效的上下文等等。

在一个理想的世界中,我想以我认为用于C的方式使用退出代码,即对于失败条件非零。但是,有一些因素可以解决这个问题:

  • 在使用非零退出代码时,我不会调用atexit(),因为我的程序清理是通过atexit()main()的{​​{1}}注册来分层处理的,我喜欢这样。
  • 在我看来,鉴于应用程序的性质 - 游戏具有与批处理程序不同的无限运行时间 - 可能永远不会出现退出代码实际使用的实际情况。它不像,例如由Makefile调用的命令行图像转换器,需要通过其退出代码知道程序是成功还是失败,从而确定是否继续构建。可能的情况是,如果程序在运行时出现任何问题,例如丢失文件,这是我自己解决的问题,那么就可以顺利进行。

在我的情况下,使用非零退出代码可以支持和反对哪些参数?

1 个答案:

答案 0 :(得分:5)

触发已注册的atexit()函数

与您的问题相反,即使程序试图将非零终止状态返回到主机环境,仍会调用向atexit()注册的函数。对[{1}}或exit()函数返回的调用将触发使用main()注册的函数,无论给出的值如何。

示例:

atexit()

即使返回#include <stdlib.h> #include <stdio.h> void print_stuff() { puts("Stuff"); } int main() { atexit(print_stuff); exit(1); } ,也会打印Stuff

技术细节

根据ISO C标准,1中注册的函数在调用atexit()后调用。以下情况也定义为调用exit()(因此触发使用exit()注册的函数):

  1. atexit()返回相当于调用main()

  2. 在最后一个帖子调用exit()后,会调用thrd_exit()

  3. 以下是可能的实现定义的调用来源exit(EXIT_SUCCESS)

    1. exit()的默认信号处理程序。

    2. 使用SIGTERM之前的默认约束处理程序。

    3. 标准提到以下情况:set_constraint_handler_s()以及对exit()注册的函数的调用被规避:

      1. 未处理的atexit()SIGABRT完成由注册SIGABRT的函数处理。可以signal()提出SIGABRT

      2. 致电abort()

      3. 致电_Exit()

      4. 在不调用quick_exit()注册的函数的情

        关于游戏的退出代码

        您选择的退出代码对游戏来说无关紧要。是的,您不会依赖shell脚本来运行游戏并向用户报告错误。对于像Linux这样的系统,错误反馈可能以对话框弹出窗口,日志或stderr的形式更有用。