行程與行程抽象

行程終止(process termination)

當房客退房時,他交還鑰匙、房間被清空,櫃檯則留下一張最後的帳單供前臺結算。行程結束也大致如此:它停止執行、作業系統回收它的資源,並留下一個小小的結果供其父行程取走。行程終止就是行程結束並被收束的方式,附帶一個回報「過程如何」的退出狀態。

行程通常藉由呼叫 exit(或從它的 main 函式返回,由執行期環境將其轉成一次 exit)而終止,並傳遞一個小整數——退出狀態或回傳碼——慣例上 0 代表成功、非零代表某種失敗。行程也可能被非自願地終止,由一個信號造成(例如在致命錯誤之後,或因為有人把它殺掉)。終止時作業系統回收大部分資源,關閉該行程的檔案、釋放它的記憶體,但有一樣東西必須短暫保留:退出狀態,保留下來好讓父行程讀取。此時行程已終止但尚未消失;在父行程以 wait 回收它之前,它仍是一個殭屍。

終止之所以重要,是因為退出狀態正是程式向「啟動它的人」回報成功或失敗的方式,讓指令稿與直譯器得以做決策(「指令成功了嗎?」)。微妙之處在於結尾的那一次握手:在父行程收取狀態之前,終止並未真正完成。若父行程從不收取,該紀錄便以殭屍的形式滯留;若父行程已先死去,init 接手並回收它。所以「行程結束了」其實有兩個階段——它停止並回報,然後它被回收並移除。

一個程式完成工作並呼叫 exit(0),代表成功。它的父行程稍後執行 wait、讀到狀態 0,便知道程式成功了。若它失敗,可能改為呼叫 exit(1)。

退出狀態 0 代表成功;非零慣例上代表失敗。

一個終止的行程在父行程回收它之前並未完全消失。在那之前它仍是一個殭屍,持有它的退出狀態與一筆行程表紀錄。

又稱
process exitexit statusreturn code行程終止退出狀態