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

7
atexit(3)的手册中写到:

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

然而,我想要修改我的程序的最终器的退出代码。我唯一成功的方法是从我的最终器函数中调用 exit(),但手册明确警告不要这样做。

这样做是否存在实际危险?是否有任何实现可能会因此出问题?更好的方法是什么?

1个回答

4
您可以调用_exit()函数来代替。
在man页面的“Notes”部分中:

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

这应该避免了POSIX规范中所警告的“递归”问题。如果您能够保证您的“退出码更改”退出处理程序最后运行,那么这个方法应该完美地工作,除了“Notes”中还列出的注意事项:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接