on_exit()函数和atexit()函数有何区别?

24

是否有任何区别?

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

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

除了on_exit使用的函数获取退出状态之外,还有其他原因吗?也就是说,如果我不关心退出状态,是否有任何理由使用其中之一?

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

5个回答

22

如果可能的话,应该使用atexit()on_exit()非标准且较少见。例如,在OS X上不可用。

Kernel.org - on_exit()

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


15
根据我找到的这个链接,似乎有一些区别。当调用on_exit函数时,它将允许您传递一个参数...这可能会让您设置一些指针来做一些清理工作,以便在退出时完成。

此外,看起来on_exit是SunOS特定的函数,可能不兼容所有平台...所以尽管它更加严格,但您可能仍希望坚持使用atexit。

5

两者的区别在于atexit是C语言中的函数,而on_exit则是一种奇怪的扩展,只能在GNU和其他类Unix系统上使用(但不是POSIX标准的一部分)。


1

@Nathan,我找不到任何可以返回当前运行进程退出代码的函数。我认为在调用atexit()时它还没有被设置。我的意思是,运行时知道它是什么,但可能还没有向操作系统报告。虽然这只是猜测。

看起来你要么需要使用on_exit(),要么构建程序结构使得退出代码无关紧要。在你的主函数中,最后一条语句将一个全局变量exited_cleanly设为true是不是也不过分呢?在你注册给atexit()的函数中,你可以检查这个变量以确定程序如何退出。这只会给你两种状态,但我认为对大多数需求来说足够了。如果必要,你也可以扩展这种方案以支持更多的退出状态。


0

@Nathan

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接