是否可以更改使用 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() 注册的函数中的退出代码?的主要内容,如果未能解决你的问题,请参考以下文章