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

时间:2008-08-14 04:53:46

标签: c linux

之间有什么区别吗?
   int on_exit(void (*function)(int , void *), void *arg);

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

除了on_exit使用的函数获得退出状态的事实?

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

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

5 个答案:

答案 0 :(得分:17)

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

Kernel.org - on_exit()

  

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

答案 1 :(得分:14)

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

@Nathan

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

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