题
有什么区别吗
int on_exit(void (*function)(int , void *), void *arg);
和
int atexit(void (*function)(void));
除了 on_exit 使用的函数获取退出状态这一事实之外?
也就是说,如果我不关心退出状态,是否有理由使用其中之一?
编辑: 许多答案都警告不要 on_exit
因为它是非标准的。如果我正在开发一个供公司内部使用并保证在特定配置上运行的应用程序,我应该担心这个吗?
解决方案
根据 这个链接 我发现,似乎有一些差异。 on_exit
会让你传递一个参数,该参数被传递给 on_exit
调用时的函数...这可能会让您设置一些指针,以便在退出时进行一些清理工作。
此外,看来 on_exit
是 SunOS 特定功能,可能无法在所有平台上兼容...所以你可能想坚持使用 atexit,尽管它有更多的限制。
其他提示
你应该使用 atexit()
如果可能的话。 on_exit()
是非标准且不太常见的。例如,它在 OS X 上不可用。
内核.org - on_exit()
:
该功能来自Sunos 4,但也存在于libc4,libc5和glibc中。它不再出现在 Solaris (SunOS 5) 中。避免使用此功能,然后使用标准ATEXIT(3)。
不同之处在于 atexit
是 C 并且 on_exit
是 GNU 和其他 Unixy 系统上可用的一些奇怪的扩展(但是 不是 POSIX 的一部分)。
@Nathan,我找不到任何可以返回当前正在运行的进程的退出代码的函数。我预计此时尚未确定 atexit()
无论如何,被称为。我的意思是运行时知道它是什么,但可能尚未将其报告给操作系统。但这几乎只是猜测。
看来您需要使用 on_exit()
或者构造你的程序,使退出代码无关紧要。让主函数中的最后一条语句翻转全局并不是不合理的 exited_cleanly
变量为真。在您注册的函数中 atexit()
, ,您可以检查此变量以确定程序如何退出。这只会给你两种状态,但我希望这足以满足大多数需求。如有必要,您还可以扩展此类方案以支持更多退出状态。
@内森
首先,查看是否有另一个 API 调用来确定退出状态...快速浏览了一下,我没有看到,但我不太熟悉标准 C API。
一个简单的替代方法是使用一个全局变量来存储退出状态......默认值是未知的错误原因(如果程序异常终止)。然后,当您调用 exit 时,您可以将退出状态存储在全局中并从任何 atexit 函数中检索它。这需要在每次退出调用之前努力存储退出状态,显然这并不理想,但如果没有 API 并且您不想冒险 on_exit
不在平台上...这可能是唯一的选择。