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

C 是否可以更改使用atexit()注册的函数中的退出代码?,c,exit-code,atexit,C,Exit Code,Atexit,的手册页显示以下内容: POSIX.1-2001指出,多次调用exit(3)的结果(即在使用atexit()注册的函数中调用exit(3))是未定义的。在某些系统(但不是Linux)上,这可能导致无限递归;可移植程序不应在使用atexit()注册的函数内调用exit(3) 但是,我对修改程序终结器中的退出代码感兴趣。我能够做到这一点的唯一方法是从finalization函数中调用exit(),但手册页明确警告不要这样做 这样做有实际危险吗?是否存在这种方法可能导致问题的实现?更好的是,还有其他方

的手册页显示以下内容:

POSIX.1-2001指出,多次调用
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取决于实现