Posted on 2013-05-14 17:32
hoshelly 閱讀(483)
評論(0) 編輯 收藏 引用 所屬分類:
Linux
在說明f o r k函數時,一定是一個父進程生成一個子進程。上面又說明了子進程將其終止狀態返回給父進程。但是如果父進程在子進程之前終止,則將如何呢?其回答是對于其父進程已經終止的所有進程,它們的父進程都改變為i n i t進程。
我們稱這些進程由i n i t進程領養。其操作過程大致是:在一個進程終止時,內核逐個檢查所有活動進程,以判斷它是否是正要終止的進程的子進程,如果是,則該進程的父進程I D就更改為1 ( i n i t進程的I D )。這種處理方法保證了每個進程有一個父進程。
如果子進程在父進程之前終止,那么父進程又如何能在做相應檢查時得到子進程的終止狀態呢?對此問題的回答是內核為每個終止子進程保存了一定量的信
息,所以當終止進程的父進程調用 w a i t或waitpid 時,可以得到有關信息。這種信息至少包括進程I D、該進程的終止狀態、以反該進程使用的 C P U時間總量。內核可以釋放終止進程所使用的所有存儲器,關閉其所有打開文件。在 U N I X術語中,一個已經終止、但是其父進程尚未對其進行善后處理(獲取終止子進程的有關信息、釋放它仍占用的資源)的進程被稱為僵死進程(z o m b i e)。p s ( 1 )命令將僵死進程的狀態打印為 Z。
一個由i n i t進程領養的進程終止時會發生什么?它會不會變成一個僵死進程?對此問題的回答是“否”,因為i n i t被編寫成只要有一個子進程終止, i n i t就會調用一個w a i t函數取得其終止狀態。這樣也就防止了在系統中有很多僵死進程。當提及“一個i n i t的子進程”時,這指的是i n i t直接產生的進程,或者是其父進程已終止,由init 領養的進程。