7

手册页atexit(3)说明如下:

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

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

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

4

1 回答 1

4

你可以打电话_exit()代替。

在手册页的 Notes 部分中:

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

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

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

于 2013-07-18T00:55:24.037 回答