2013-07-18 35 views
5

的手冊頁atexit(3)說以下內容:是否可以通過atexit()註冊函數來更改退出代碼?

POSIX.1-2001說,呼籲exit(3)不止一次的結果是不確定的(即調用函數中使用exit(3)註冊atexit())。在某些系統(但不是Linux)上,這會導致無限遞歸;便攜式程序不應在使用atexit()註冊的函數內調用exit(3)

但是,我有興趣修改我的程序的終結器退出代碼。我設法做到這一點的唯一方法是在我的定稿函中調用exit(),但手冊頁明確提出了這個問題。

這樣做有沒有實際的危險?有沒有實現這種方法可能導致問題的實現?更好的是,有沒有另外一種方法呢?

回答

3

您可以改爲撥打_exit()

在手冊頁的註釋部分:

功能_exit()就像exit(),但不調用與atexit()on_exit()註冊的任何功能。

這應該避免在POSIX規範中被警告的「遞歸」問題。如果你以某種方式能夠保證你的「退出代碼改變」退出處理跑最後一棒,這應該很好地工作,模的告誡在Notes還列出:

無論是刷新標準I/O緩衝區和刪除臨時使用tmpfile(3)創建的文件依賴於實現。另一方面,_exit()確實會關閉打開的文件描述符,這可能會導致未知的延遲,等待待處理的輸出完成。如果延遲不期望,在致電_exit()之前調用諸如tcflush(3)之類的函數可能很有用。是否取消任何待處理的I/O,以及哪些待處理的I/O可能在_exit()上取消,取決於實施。

相關問題