on_exit()和atexit()函数之间有区别吗?
之间有什么区别
int on_exit(void (*function)(int , void *), void *arg);
和
int atexit(void (*function)(void));
除了on_exit使用的函数获得退出状态的事实之外?
也就是说,如果我不在乎退出状态,是否有任何理由使用一个或者另一个?
编辑:许多答案都警告" on_exit",因为它是非标准的。如果我正在开发供公司内部使用并保证可以在特定配置上运行的应用程序,我应该为此担心吗?
解决方案
回答
如果可能,我们应该使用atexit()
。 on_exit()是非标准的,不太常见。例如,它在OS X上不可用。
Kernel.orgon_exit()
:
This function comes from SunOS 4, but is also present in libc4, libc5 and glibc. It no longer occurs in Solaris (SunOS 5). Avoid this function, and use the standard atexit(3) instead.
回答
根据我发现的此链接,似乎存在一些差异。 on_exit将允许我们传入一个参数,该参数在调用时将传递给on_exit函数。这可能会让我们设置一些指针以在需要退出时进行一些清理工作。
此外,似乎" on_exit"是SunOS特定的功能,可能并非在所有平台上都兼容...因此,尽管限制性更强,但我们仍可以坚持使用atexit。
回答
@内森
首先,看看是否有另一个API调用来确定退出状态...快速浏览,我没有看到,但是我对标准C API并不熟悉。
一个简单的选择是拥有一个存储退出状态的全局变量……默认值是未知的错误原因(因为程序异常终止)。然后,当我们调用exit时,我们可以将退出状态存储在全局变量中,并从任何atexit函数中检索它。这要求在每次退出调用之前都认真地存储退出状态,这显然不是理想的选择,但是如果没有API并且我们不希望冒on_exit不在平台上的风险……这可能是唯一的选择。
回答
@Nathan,我找不到任何函数将返回当前正在运行的进程的退出代码。我希望无论如何都不会在调用atexit()时设置它。我的意思是说运行时知道它是什么,但可能尚未将其报告给操作系统。但是,这几乎只是猜测。
看起来我们可能需要使用on_exit()或者结构化程序,以便退出代码无关紧要。让主函数中的最后一条语句将全局exited_cleanly
变量翻转为true并非不合理。在使用atexit()注册的函数中,可以检查此变量以确定程序如何退出。这只会给我们两个状态,但是我希望这足以满足大多数需求。如果需要,我们还可以扩展这种类型的方案以支持更多的退出状态。
回答
不同之处在于atexit
是C,而on_exit
是GNU和其他谁知道Unixy系统(但不属于POSIX)的怪异扩展。