是否可以更改使用 atexit() 注册的函数中的退出代码?

Posted

技术标签:

【中文标题】是否可以更改使用 atexit() 注册的函数中的退出代码?【英文标题】:Is it possible to change the exit code in a function registered with atexit()? 【发布时间】:2013-07-18 00:46:16 【问题描述】:

atexit(3) 的手册页内容如下:

POSIX.1-2001 表示多次调用exit(3)(即在使用atexit() 注册的函数中调用exit(3))的结果是未定义的。在某些系统上(但不是 Linux),这可能导致无限递归;可移植程序不应在使用atexit() 注册的函数内调用exit(3)

但是,我有兴趣在我的程序的终结器中修改退出代码。我设法做到这一点的唯一方法是在我的终结函数中调用exit(),但手册页明确警告不要这样做。

这样做有什么实际危险吗?是否有任何实现该方法可能会导致问题?更好的是,还有其他方法吗?

【问题讨论】:

【参考方案1】:

您可以改为拨打_exit()

在手册页的注释部分:

函数_exit() 类似于exit(),但不调用任何在atexit()on_exit() 注册的函数。

这应该避免 POSIX 规范中警告的“递归”问题。如果您能够以某种方式保证您的“退出代码更改”退出处理程序最后运行,那么这应该可以完美运行,以注释中也列出的警告为模:

它是否刷新标准 I/O 缓冲区并删除使用 tmpfile(3) 创建的临时文件取决于实现。另一方面,_exit() 确实关闭了打开的文件描述符,这可能会导致未知的延迟,等待挂起的输出完成。如果不希望延迟,在调用_exit() 之前调用tcflush(3) 之类的函数可能会很有用。是否取消任何挂起的 I/O,以及在_exit() 上可以取消哪些挂起的 I/O,取决于实现。

【讨论】:

以上是关于是否可以更改使用 atexit() 注册的函数中的退出代码?的主要内容,如果未能解决你的问题,请参考以下文章

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

atexit()函数

Python atexit模块

Linux - atexit()(注册终止)函数

Linux中相关知识(atexit(),fork(),粘滞位)

C++ 中全局对象销毁和 atexit 之间的顺序