電腦領域中,子行程為由另外一個行程(對應稱之為父行程)所建立的行程。子行程繼承了父行程的大部分屬性,例如檔案描述子

產生

編輯

Unix中,子行程通常為系統呼叫fork的產物。在此情況下,子行程一開始就是父行程的副本,而在這之後,根據具體需要,子行程可以藉助exec英語Exec (operating system)呼叫來鏈式載入英語Chain loading另一程式。

與父行程的關係

編輯

一個行程可能下屬多個子行程,但最多只能有1個父行程,而若某一行程沒有父行程,則可知該行程很可能由內核直接生成。在Unix類Unix系統中,行程ID為1的行程(即init行程)是在系統引導階段由內核直接建立的,且不會在系統執行過程中終止執行(可參見Linux啟動流程);而對於其他無父行程的行程,則可能是為在用戶空間完成各種後台任務而執行的。

當某一子行程結束、中斷或恢復執行時,內核會傳送SIGCHLD訊號予其父行程。在預設情況下,父行程會以SIG_IGN函數忽略之[1]

「孤兒行程」與「殭屍行程」

編輯

在對應的父行程結束執行後,行程就會變成孤兒行程,但之後會立即由init行程「收養」為其子行程。

某一子行程終止執行後,若其父行程未提前呼叫wait,則內核會持續保留子行程的退出狀態等資訊,以使父行程可以wait取得之[2] 。而因為在這種情況下,子行程雖已終止,但仍在消耗系統資源,所以其亦稱殭屍行程wait常於SIGCHLD訊號的處理常式中呼叫。

解決與預防

編輯

POSIX.1-2001標準規定中,父行程可將SIGCHLD的處理常式設為SIG_IGN(亦為預設設定),或為SIGCHLD設定SA_NOCLDWAIT標記,以使內核可以自動回收已終止的子行程的資源。自Linux 2.6與FreeBSD 5.0起,兩種內核皆支援了這兩種方式[3]。但是,在忽略SIGCHLD訊號的問題上,由於System VBSD由來已久的差異,若要回收衍生出的子行程的資源,呼叫wait仍是最便捷的方式[2][4]

參見

編輯

參考資料

編輯
  1. ^ signal: overview of signals – 參考,單一UNIX®規範第7期,由國際開放標準組織發佈
  2. ^ 2.0 2.1 wait: wait for process to change state – 參考,單一UNIX®規範第7期,由國際開放標準組織發佈
  3. ^ http://fuse4bsd.creo.hu/localcgi/maSA_NOCLDWAITSA_NOCLDWAITn-cgi.cgi?signal+3[永久失效連結]
  4. ^ sigaction: examine and change a signal action – 參考,單一UNIX®規範第7期,由國際開放標準組織發佈
  5. ^ pstree: print process trees – 參考,單一UNIX®規範第7期,由國際開放標準組織發佈

本條目部分或全部內容出自以GFDL授權發佈的《自由線上電腦詞典》(FOLDOC)。