2008-08-14 34 views
17

on_exit()和atexit()函數有區別嗎?

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

int atexit(void (*function)(void)); 
比一個事實,即ON_EXIT使用的功能得到退出狀態等

之間有什麼區別?

也就是說,如果我不關心退出狀態,是否有任何理由使用其中一種?

編輯:許多答案警告與on_exit,因爲它是非標準的。如果我正在開發一個適用於企業內部使用的應用程序,並保證在特定配置上運行,我應該擔心這一點嗎?

回答

14

根據this link我發現,似乎有一些差異。 on_exit將允許您傳入一個參數,該參數在被調用時傳遞給on_exit函數......這可能允許您設置一些指針,以便在退出時進行一些清理工作。

此外,看起來on_exit是SunOS特定功能,可能在所有平臺上都不兼容......所以您可能想要堅持使用atexit,儘管它更具限制性。

17

如果可能,您應該使用atexit()on_exit()是非標準的並且不太常見。例如,它不適用於OS X.

Kernel.org - on_exit()

此功能來自於在SunOS 4,但也存在於libc4,libc5的和 glibc的。它不再發生在Solaris(SunOS 5)中。避免使用此功能,並且 改爲使用標準atexit(3)。

0

@Nathan

首先,看看有沒有另一個API調用來確定退出狀態...看一眼,我沒有看到一個,但我沒有很好的標準C API的熟悉。

一個簡單的替代方法是有一個全局變量,用於存儲退出狀態...默認情況下是未知的錯誤原因(因爲如果程序異常終止)。然後,當您調用exit時,您可以將退出狀態存儲在全局中並從任何atexit函數中檢索它。這要求在每次退出調用之前勤勉地存儲退出狀態,顯然並不理想,但如果沒有API並且您不想在平臺上冒險on_exit ......這可能是唯一的選擇。

1

@Nathan,我找不到任何函數將返回當前正在運行的進程的退出代碼。無論如何,我預計它在調用atexit()時尚未設置。我的意思是運行時知道它是什麼,但可能沒有向操作系統報告。但這只是猜測。

看起來你需要使用on_exit()或者構造你的程序,以便退出代碼無關緊要。讓主函數中的最後一個語句將全局變量exited_cleanly變爲true並不是不合理的。在atexit()註冊的功能中,您可以檢查該變量以確定程序退出的方式。這隻會給你兩個國家,但我認爲這對大多數需求來說已經足夠了。如果需要,您還可以擴展此類型的方案以支持更多的退出狀態。

3

不同的是,atexit是C和on_exit是GNU提供一些奇怪的延伸,誰也不知道的什麼,其他Unixy系統(但POSIX的部分)。