在使用atexit()注册的函数中获取退出状态

6
在我的 atexit() 注册函数中,我想获取退出状态(即传递给 exit(3) 的参数或 main() 返回的值)。
有没有一种可移植的方法来实现这个目标?是否有任何 GNU libc 特定的方法可以做到这一点,例如一个全局变量可以保存该值供我参考?
2个回答

3

这里有一个技巧:

// hack.c
int last_exit;

// hack.h
extern int last_exit;
#define exit(x) (exit)(last_exit = (x))

虽然这种方法对于return来说行不通,但是,嘿,它是可移植的!

更加便于维护的做法是,您可能想考虑编写某种包装器来为您执行类似的操作。围绕GCC如何实现exit()进行修改听起来像是一场维护噩梦。最好编写一些帮助函数来退出程序,并且如果您喜欢这种方式,甚至可以使用宏来屏蔽它们。使用宏,您甚至可以替换return调用,如果您总是使用括号调用return的话。尽管这听起来更像是一场维护噩梦。


谢谢。在调用exit()之前设置自己的全局变量,并在注册的函数中使用它似乎是最好的想法。 - Sean A.O. Harney
记得在宏定义中的 exit 周围加上括号 - 这样可以确保宏不会尝试调用自身,但允许宏调用同名函数。我最近才学到这个技巧,但它可以避免使用类似于 #define EXIT(x) exit(last_exit = x) 这样明显的 hack。全大写只是丑陋的。 - Chris Lutz
1
在宏定义中,建议在 (x) 周围加上额外的括号。 - caf
@caf - 我的错。我通常会这样做。就我所知,如果没有括号,它不会出现任何问题 - 唯一优先级较低的运算符是“,”,这将导致完全不同(且相当易于捕获)的问题。 - Chris Lutz

0

你可能想使用 on_exit。它已被弃用,而且这不是 Posix 标准,但至少它在 glibc 中。


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