21

有没有区别

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

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

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

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

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

4

5 回答 5

18

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

内核.org - on_exit()

此函数来自 SunOS 4,但也存在于 libc4、libc5 和 glibc 中。它不再出现在 Solaris (SunOS 5) 中。避免使用这个函数,而是使用标准的 atexit(3)。

于 2008-08-14T04:59:55.607 回答
14

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

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

于 2008-08-14T05:03:17.707 回答
4

不同之处在于它atexit是 C 并且on_exit是 GNU 和谁知道什么其他 Unixy 系统(但不是POSIX 的一部分)上可用的一些奇怪的扩展。

于 2010-07-17T20:20:53.750 回答
1

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

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

于 2008-08-14T08:09:47.563 回答
0

@内森

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

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

于 2008-08-14T06:51:23.337 回答