on_exit() 和 atexit() 函数之间有区别吗?

Posted

技术标签:

【中文标题】on_exit() 和 atexit() 函数之间有区别吗?【英文标题】:Is there a difference between the on_exit() and atexit() functions? 【发布时间】:2010-09-05 20:34:36 【问题描述】:

有什么区别

   int on_exit(void (*function)(int , void *), void *arg);

   int atexit(void (*function)(void));

除了on_exit使用的函数获得退出状态之外?

也就是说,如果我不关心退出状态,是否有任何理由使用其中一个?

编辑:许多答案警告on_exit,因为它是非标准的。如果我正在开发一个供内部公司使用并保证在特定配置上运行的应用程序,我应该担心这个吗?

【问题讨论】:

【参考方案1】:

不同之处在于atexit 是 C,而on_exit 是 GNU 和其他 Unixy 系统上可用的一些奇怪的扩展(但 不是 POSIX 的一部分)。

【讨论】:

【参考方案2】:

@Nathan,我找不到任何可以返回当前运行进程的退出代码的函数。无论如何,我希望在调用atexit() 时它还没有设置。我的意思是运行时知道它是什么,但可能没有将它报告给操作系统。不过,这几乎只是猜测。

看起来您要么需要使用on_exit(),要么构建您的程序,以便退出代码无关紧要。让 main 函数中的最后一条语句将全局 exited_cleanly 变量翻转为 true 并不是不合理的。在您向atexit() 注册的函数中,您可以检查此变量以确定程序如何退出。这只会给你两种状态,但我希望这足以满足大多数需求。如有必要,您还可以扩展此类方案以支持更多退出状态。

【讨论】:

【参考方案3】:

@内森

首先,看看是否有另一个 API 调用来确定退出状态...快速浏览一下,我没有看到,但我并不精通标准 C API。

一个简单的替代方法是使用一个全局变量来存储退出状态...默认是未知的错误原因(如果程序异常终止)。然后,当您调用 exit 时,您可以将退出状态存储在全局中并从任何 atexit 函数中检索它。这需要在每次退出调用之前认真存储退出状态,显然并不理想,但如果没有 API 并且您不想冒险on_exit 不在平台上......它可能是唯一的选择。

【讨论】:

【参考方案4】:

根据this link我发现,似乎有一些差异。 on_exit 将允许您传入一个参数,该参数在调用 on_exit 函数时传递给它......这可能让您设置一些指针,以便在退出时进行一些清理工作。

此外,on_exit 似乎是特定于 SunOS 的功能,可能无法在所有平台上兼容...因此您可能希望坚持使用 atexit,尽管它具有更多限制性。

【讨论】:

【参考方案5】:

如果可能,您应该使用atexit()on_exit() 是非标准的,不太常见。例如,它在 OS X 上不可用。

Kernel.org - on_exit():

此函数来自 SunOS 4,但也存在于 libc4、libc5 和 glibc。它不再出现在 Solaris (SunOS 5) 中。避免使用此功能,并且 请改用标准的 atexit(3)。

【讨论】:

以上是关于on_exit() 和 atexit() 函数之间有区别吗?的主要内容,如果未能解决你的问题,请参考以下文章

atexit函数和两种特殊文件权限位

exit()函数和atexit()函数 复习

关于atexit函数

atexit函数和exit函数的理解

atexit()函数

进程环境详解---进程终止和 atexit 函数详解