gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:26:17 25 4
gpt4 key购买 nike

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

在理想情况下,我想以我认为适用于 C 的方式使用退出代码,即非零用于失败条件。但是,有一些因素会影响到这一点:

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

在我的情况下,支持和反对使用非零退出代码有哪些论据?

最佳答案

触发注册的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()注册的函数):

  1. main() 返回等价于调用exit()

  2. 最后一个线程调用thrd_exit()后,exit(EXIT_SUCCESS)被调用。

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

  1. SIGTERM 的默认信号处理程序。

  2. 使用前的默认约束处理程序set_constraint_handler_s()

该标准提到了以下情况,其中 exit() 和对使用 atexit() 注册的函数的调用被规避:

  1. 未处理的 SIGABRTSIGABRT 已完成由使用 signal() 注册的函数处理。 SIGABRT 可以由 abort() 引发。

  2. 调用_Exit()

  3. 调用 quick_exit().

在某些情况下,您实现的宿主环境可能会终止程序,而无需调用在 atexit() 中注册的函数,例如在 segfault 之后.

关于游戏的退出代码

您选择的退出代码对于游戏来说应该没有太大影响。是的,您不会依赖 shell 脚本来运行游戏并向用户报告错误。对于 Linux 等系统,错误反馈可能以对话框弹出、日志或标准错误的形式更有用。

关于实时/非批处理应用程序中的 C 退出代码和 atexit(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31864476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com