2010-02-04 27 views
5

Bên atexit của tôi() chức năng đăng ký Tôi muốn để có được trạng thái thoát (hoặc lập luận để exit (3) hoặc những gì main() trở lại với).Lấy trạng thái thoát từ bên trong một chức năng đăng ký với atexit()

Có cách nào để thực hiện điều này không? Có cách nào đặc biệt của GNU libc để thực hiện nó như một tổ chức toàn cầu có giá trị mà tôi có thể tham khảo?

Trả lời

3

Dưới đây là một hack:

// hack.c 
int last_exit; 

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

sẽ không làm việc cho return, nhưng, hey, nó cầm tay!

Trên một lưu ý thân thiện hơn, bạn có thể muốn xem xét viết một số hình thức bao bọc để làm một cái gì đó tương tự như thế này cho bạn. Hacking xung quanh cách GCC thực hiện exit() âm thanh như một cơn ác mộng bảo trì. Tốt hơn là viết một vài hàm trợ giúp để thoát ra cho bạn, và thậm chí có thể che giấu chúng bằng các macro nếu bạn đang sử dụng loại đó. Với macro, bạn thậm chí có thể thay thế các cuộc gọi return, nếu bạn luôn gọi return bằng dấu ngoặc đơn. Mặc dù điều này nghe có vẻ giống như một cơn ác mộng bảo trì.

+0

Cảm ơn. Có thiết lập toàn cầu của riêng tôi trước khi gọi exit() và sử dụng trong func đăng ký của tôi có vẻ như ý tưởng tốt nhất. –

+0

Nhớ dấu ngoặc đơn quanh 'thoát' trong macro - chúng đảm bảo rằng macro sẽ không cố gọi chính nó, nhưng cho phép macro gọi hàm có cùng tên. Gần đây tôi chỉ học được mẹo đó, nhưng nó cho phép bạn tránh làm cho hack của bạn hiển nhiên rõ ràng với một thứ như '#define EXIT (x) exit (last_exit = x)'. Tất cả các mũ chỉ là xấu xí. –

+1

Một bộ dấu ngoặc bổ sung xung quanh '(x)' trong định nghĩa macro được khuyến khích. – caf

0

Bạn có thể muốn sử dụng on_exit. Điều này không được chấp nhận, và đây không phải là Posix, nhưng ít nhất nó là glibc.

Các vấn đề liên quan