2008-08-14 27 views
17

Có sự khác biệt giữaCó sự khác biệt nào giữa các hàm on_exit() và atexit() không?

int on_exit(void (*function)(int , void *), void *arg); 

int atexit(void (*function)(void)); 

khác so với thực tế là các chức năng được sử dụng bởi on_exit được trạng thái thoát?

Tức là, nếu tôi không quan tâm đến trạng thái thoát, có lý do nào để sử dụng cái này hay cái kia không?

Chỉnh sửa: Nhiều câu trả lời được cảnh báo chống lại on_exit vì nó không chuẩn. Nếu tôi đang phát triển một ứng dụng dành cho việc sử dụng nội bộ của công ty và được đảm bảo chạy trên các cấu hình cụ thể, tôi có nên lo lắng về điều này không?

Trả lời

14

Theo this link Tôi thấy, có vẻ như có một vài khác biệt. on_exit sẽ cho phép bạn vượt qua đối số được chuyển đến hàm on_exit khi được gọi ... có thể cho phép bạn thiết lập một số gợi ý để thực hiện một số công việc dọn dẹp khi đến lúc thoát.

Hơn nữa, có vẻ như on_exit là một chức năng cụ thể của SunOS có thể không tương thích trên tất cả các nền tảng ... vì vậy bạn có thể muốn gắn bó với nó, mặc dù nó hạn chế hơn.

17

Bạn nên sử dụng atexit() nếu có thể. on_exit() không chuẩn và ít phổ biến hơn. Ví dụ, nó không có sẵn trên OS X.

Kernel.org - on_exit():

chức năng này xuất phát từ SunOS 4, nhưng cũng có mặt trong libc4, libc5 và glibc. Nó không còn xuất hiện trong Solaris (SunOS 5). Tránh sử dụng chức năng này, và thay vào đó, sử dụng tiêu chuẩn atexit (3).

0

@ Nathan

Thứ nhất, xem nếu có một cuộc gọi API để xác định trạng thái thoát ... trong nháy mắt nhanh chóng và tôi không thấy một, nhưng tôi không thành thạo trong C API chuẩn.

Một giải pháp thay thế dễ dàng là có biến toàn cục lưu trữ trạng thái thoát ... mặc định là nguyên nhân lỗi không xác định (nếu chương trình chấm dứt bất thường). Sau đó, khi bạn gọi thoát, bạn có thể lưu trữ trạng thái thoát trong toàn cục và truy xuất nó từ bất kỳ chức năng atexit nào. Điều này đòi hỏi phải lưu trữ trạng thái thoát một cách siêng năng trước mỗi cuộc gọi thoát, và rõ ràng không phải là lý tưởng, nhưng nếu không có API và bạn không muốn mạo hiểm on_exit không ở trên nền tảng ... nó có thể là tùy chọn duy nhất.

1

@Nathan, tôi không thể tìm thấy bất kỳ chức năng nào sẽ trả lại mã thoát cho quy trình đang chạy hiện tại. Tôi hy vọng rằng nó không được thiết lập được nêu ra tại thời điểm khi atexit() được gọi là, anyway. Bởi điều này tôi có nghĩa là thời gian chạy biết nó là gì, nhưng có lẽ đã không báo cáo nó cho hệ điều hành. Điều này là khá nhiều chỉ là phỏng đoán, mặc dù.

Có vẻ như bạn sẽ cần phải sử dụng on_exit() hoặc cấu trúc chương trình của bạn để mã thoát không quan trọng. Nó sẽ không phải là không hợp lý để có tuyên bố cuối cùng trong chức năng chính của bạn lật một biến số exited_cleanly toàn cầu thành true.Trong chức năng bạn đăng ký với atexit(), bạn có thể kiểm tra biến này để xác định cách chương trình đã thoát. Điều này sẽ chỉ cung cấp cho bạn hai tiểu bang, nhưng tôi hy vọng rằng sẽ là đủ cho hầu hết các nhu cầu. Bạn cũng có thể mở rộng loại lược đồ này để hỗ trợ nhiều trạng thái thoát hơn nếu cần.

3

Sự khác biệt là atexit là C và on_exit là một số phần mở rộng lạ sẵn trên GNU và người-biết-gì-khác hệ thống Unixy (nhưng KHÔNG phần của POSIX).