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