Ale*_*ing 7 c exit-code atexit
手册页atexit(3)说明如下:
POSIX.1-2001表示不定义调用的结果
exit(3)(即,exit(3)在使用注册的函数内调用atexit()).在某些系统(但不是Linux)上,这可能会导致无限递归; 便携式程序不应exit(3)在使用注册的函数内调用atexit().
但是,我有兴趣在我的程序的终结器中修改退出代码.我设法做到这一点的唯一方法是exit()从我的终结函数中调用,但是手册页明确警告不要这样做.
这样做有什么实际危险吗?是否有任何实现方法可能导致问题?更好的是,还有另一种方法吗?
你可以打电话_exit()代替。
在手册页的注释部分中:
该函数
_exit()类似于exit(),但不调用任何用atexit()或注册的函数on_exit()。
这应该可以避免 POSIX 规范中警告的“递归”问题。如果您能够以某种方式保证“退出代码更改”退出处理程序最后运行,那么这应该可以完美地工作,模数注释中也列出了警告:
是否刷新标准 I/O 缓冲区并删除使用创建的临时文件
tmpfile(3)取决于实现。另一方面,_exit()确实关闭打开的文件描述符,这可能会导致未知的延迟,等待挂起的输出完成。如果不希望出现延迟,则像tcflush(3)调用 before 那样调用函数可能会很有用_exit()。是否取消任何挂起的 I/O,以及可以取消哪些挂起的 I/O_exit(),取决于实现。