C 是否可以更改使用atexit()注册的函数中的退出代码?
的手册页显示以下内容: POSIX.1-2001指出,多次调用C 是否可以更改使用atexit()注册的函数中的退出代码?,c,exit-code,atexit,C,Exit Code,Atexit,的手册页显示以下内容: POSIX.1-2001指出,多次调用exit(3)的结果(即在使用atexit()注册的函数中调用exit(3))是未定义的。在某些系统(但不是Linux)上,这可能导致无限递归;可移植程序不应在使用atexit()注册的函数内调用exit(3) 但是,我对修改程序终结器中的退出代码感兴趣。我能够做到这一点的唯一方法是从finalization函数中调用exit(),但手册页明确警告不要这样做 这样做有实际危险吗?是否存在这种方法可能导致问题的实现?更好的是,还有其他方
exit(3)
的结果(即在使用atexit()注册的函数中调用exit(3)
)是未定义的。在某些系统(但不是Linux)上,这可能导致无限递归;可移植程序不应在使用atexit()
注册的函数内调用exit(3)
但是,我对修改程序终结器中的退出代码感兴趣。我能够做到这一点的唯一方法是从finalization函数中调用exit()
,但手册页明确警告不要这样做
这样做有实际危险吗?是否存在这种方法可能导致问题的实现?更好的是,还有其他方法吗?您可以打电话
在手册页的“注释”部分中:
函数\u exit()
类似于exit()
,但不调用使用atexit()
或注册的任何函数
这应该可以避免POSIX规范中警告的“递归”问题。如果您能够以某种方式保证“退出代码更改”退出处理程序最后运行,那么这应该可以很好地工作,包括注释中列出的警告:
它是否刷新标准I/O缓冲区并删除使用tmpfile(3)
创建的临时文件取决于实现。另一方面,\u exit()。如果延迟是不需要的,在调用\u exit()
之前调用类似于tcflush(3)
的函数可能会很有用。是否取消任何挂起的I/O,以及在退出()时可以取消哪些挂起的I/O取决于实现