int on_exit(void (*function)(int , void *), void *arg);
和
int atexit(void (*function)(void));
比一個事實,即ON_EXIT使用的功能得到退出狀態等
之間有什麼區別?
也就是說,如果我不關心退出狀態,是否有任何理由使用其中一種?
編輯:許多答案警告與on_exit
,因爲它是非標準的。如果我正在開發一個適用於企業內部使用的應用程序,並保證在特定配置上運行,我應該擔心這一點嗎?
int on_exit(void (*function)(int , void *), void *arg);
和
int atexit(void (*function)(void));
比一個事實,即ON_EXIT使用的功能得到退出狀態等
之間有什麼區別?
也就是說,如果我不關心退出狀態,是否有任何理由使用其中一種?
編輯:許多答案警告與on_exit
,因爲它是非標準的。如果我正在開發一個適用於企業內部使用的應用程序,並保證在特定配置上運行,我應該擔心這一點嗎?
根據this link我發現,似乎有一些差異。 on_exit
將允許您傳入一個參數,該參數在被調用時傳遞給on_exit
函數......這可能允許您設置一些指針,以便在退出時進行一些清理工作。
此外,看起來on_exit
是SunOS特定功能,可能在所有平臺上都不兼容......所以您可能想要堅持使用atexit,儘管它更具限制性。
如果可能,您應該使用atexit()
。 on_exit()
是非標準的並且不太常見。例如,它不適用於OS X.
Kernel.org - on_exit()
:
此功能來自於在SunOS 4,但也存在於libc4,libc5的和 glibc的。它不再發生在Solaris(SunOS 5)中。避免使用此功能,並且 改爲使用標準atexit(3)。
@Nathan
首先,看看有沒有另一個API調用來確定退出狀態...看一眼,我沒有看到一個,但我沒有很好的標準C API的熟悉。
一個簡單的替代方法是有一個全局變量,用於存儲退出狀態...默認情況下是未知的錯誤原因(因爲如果程序異常終止)。然後,當您調用exit時,您可以將退出狀態存儲在全局中並從任何atexit函數中檢索它。這要求在每次退出調用之前勤勉地存儲退出狀態,顯然並不理想,但如果沒有API並且您不想在平臺上冒險on_exit
......這可能是唯一的選擇。
@Nathan,我找不到任何函數將返回當前正在運行的進程的退出代碼。無論如何,我預計它在調用atexit()
時尚未設置。我的意思是運行時知道它是什麼,但可能沒有向操作系統報告。但這只是猜測。
看起來你需要使用on_exit()
或者構造你的程序,以便退出代碼無關緊要。讓主函數中的最後一個語句將全局變量exited_cleanly
變爲true並不是不合理的。在atexit()
註冊的功能中,您可以檢查該變量以確定程序退出的方式。這隻會給你兩個國家,但我認爲這對大多數需求來說已經足夠了。如果需要,您還可以擴展此類型的方案以支持更多的退出狀態。
不同的是,atexit
是C和on_exit
是GNU提供一些奇怪的延伸,誰也不知道的什麼,其他Unixy系統(但POSIX的不部分)。