『exit()』與『_exit()』有不少區別在使用『fork()』,特別是『vfork()』時變得很
突出。

『exit()』與『_exit()』的基本區別在於前一個調用實施與調用庫裡用戶狀態結構
(user-mode constructs)有關的清除工作(clean-up),而且調用用戶自定義的清除程序
(譯者註:自定義清除程序由atexit函數定義,可定義多次,並以倒序執行),相對
應,後一個函數只為進程實施內核清除工作。

在由『fork()』創建的子進程分支裡,正常情況下使用『exit()』是不正確的,這是
因為使用它會導致標準輸入輸出(譯者註:stdio: Standard Input Output)的緩衝區被
清空兩次,而且臨時文件被出乎意料的刪除(譯者註:臨時文件由tmpfile函數創建
在系統臨時目錄下,文件名由系統隨機生成)。在C++程序中情況會更糟,因為靜
態目標(static objects)的析構函數(destructors)可以被錯誤地執行。(還有一些特殊情
況,比如守護程序,它們的*父進程*需要調用『_exit()』而不是子進程;適用於絕
大多數情況的基本規則是,『exit()』在每一次進入『main』函數後只調用一次。)

在由『vfork()』創建的子進程分支裡,『exit()』的使用將更加危險,因為它將影響
*父*進程的狀態。

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()