int main()
}else}}
此時程式執行後,在子程式結束後,父程序尚且沒有完成,此時檢視一下程序資訊,可以得到
可以看到兩個signalttt程序,其中子程式的signalttt程序已經處於defunct狀態,此時子程序已經**執行完畢,但是這個程序並沒有終止,這就對cpu的程序資源造成了很多的浪費,如果說短時間內產成了大量的僵死程序,那麼此時因為程序號等資訊占用,此時不能建立新的程序
我們來改一下**:
int main()
}else}}
再次在執行途中檢視ps
此時並沒有和之前一樣出現僵死程序,而我們僅僅是將子程序改的執行的時間比父程序長了一些,然後再次檢視時候,發現僵死程序就消失了???
所以我們可以得到條件,僵死程序中,父程序一定要「活得久」~
這裡本質上是因為,在linux系統中,程序是有父子關係的,從init程序開始展開,是乙個大的程序樹,而子程序的結束都會由子程序向它的父程序傳送乙個訊號(sigchld),而此時如果父程序在執行中沒有獲取子程序的退出碼,這樣就出現了僵死程序
在linux系統中有乙個特殊的處理方法,signal(sigchld,sig_ign);
子程序在結束時候會向父程序傳送乙個子程序結束的訊號,我們呼叫signal函式去忽略掉這個訊號,那麼這時候子程序就會變成了孤兒程序,會自動的被init接收處理,init程序會在程序表中挨個查詢孤兒程序,也就是說,程序表越大那麼這個過程造成的資源占用也就越多
也可以在父程序中用wait();
函式,這樣在執行到這句時,父程序會等待到子程序結束後,但是這句會造成父程序的掛起
同樣的,也可以用signal(sigchld,fun);
去實現乙個處理子程序訊號的函式,讓父程序接收到訊號之後,呼叫wait()
將子程序結束掉
還有一種特殊的是利用兩次fork()
,這樣父程序在第一次建立的子程序1中,再次建立乙個子程序2,子程序2負責執行子程序的工作,而子程序1只做一件事件--------wait(子程序2);專心致志等待子程序2結束,這樣就處理了wait導致的程序掛起的問題
linux僵死程序
乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為僵死程序 zombie 的資料結構 系統呼叫exit,它的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個僵死程序,並不能將其完全銷毀 一 僵死程序的產生 在每個程序退出的時候,核心釋放該程序所有的資源,...
linux僵死程序
乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為僵死程序 zombie 的資料結構 系統呼叫exit,它的作用是使程序退出,但也僅僅限於將乙個正常的程序變成乙個僵死程序,並不能將其完全銷毀 一 僵死程序的產生 在每個程序退出的時候,核心釋放該程序所有的資源,...
postgres kill僵死程序
在資料庫postgresql中,乙個客戶端到伺服器連線實際上是乙個tcp socket連線,tcp連線是虛連線,一方非正常退出 如斷電 另一方會繼續維持這個連線。舉個例子,乙個客戶端電腦正常連上伺服器後,強行拔掉電源造 為斷電,重新啟動電腦,再此連上伺服器。用sql語句select from pg ...