1. 背景
前幾天參加乙個面試,遇到了這個問題:你知道殭屍程序怎麼產生的麼?所以來總結一下這個問題。
2.殭屍程序與孤兒程序
會涉及到兩個概念:父程序、子程序。
正常情況下,子程序是通過父程序建立的,子程序再建立新的程序。子程序的結束和父程序的執行是乙個非同步過程,即父程序永遠無法知道子程序到底何時結束。 當乙個程序完成任務終止之後,它的父程序需要呼叫wait()或者waitpid()系統呼叫釋放子程序。
殭屍程序的產生:父程序使用fork建立子程序,如果子程序退出,而父程序並沒有呼叫wait或waitpid獲取子程序的狀態資訊,那麼子程序的程序描述符仍然儲存在系統中,這種程序稱之為殭屍程序。
孤兒程序:乙個父程序退出,而它的子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作。
3.殭屍程序的危害與解決
危害:如果父程序不呼叫wait / waitpid, 那麼保留子程序一直沒有釋放,其程序號就會一直被占用,但是系統所能使用的程序號是有限的,如果大量的產生殭屍程序,將因為沒有可用的程序號而導致系統不能產生新的程序. 此即為殭屍程序的危害,應當避免。
解決方式就是殺死殭屍程序的父程序,讓其變為孤兒程序,使用init程序進行**。
Linux 殭屍程序與孤兒程序
之前的部落格有講過儲存程序資訊的乙個重要的資料結構,task struct結構體,其中,state表示程序可能出現的狀態。如下 static const char const task state array 我們對個別狀態進行解釋如下 s sleeping 淺度睡眠,也是不可中斷睡眠。d disk...
Linux 殭屍程序與孤兒程序
產生原因 子程序先於父程序退出,他要保留退出原因在pcb中,因此退出後不會自動釋放所有資源,子程序退出後作業系統會通知父程序,子程序退出了,去獲取一下原因,然後完全釋放子程序資源,假如父程序不管子程序的退出狀態,那麼這個子程序將進入僵死狀態,成為殭屍程序 實現殭屍程序 該程式為20秒的殭屍程序,在第...
Linux 殭屍程序與孤兒程序
殭屍程序 產生原因 子程序先於父程序退出,他要保留退出原因在pcb中,因此退出後不會自動釋放所有資源,子程序退出後作業系統會通知父程序,子程序退出了,去獲取一下原因,然後完全釋放子程序資源,假如父程序不管子程序的退出狀態,那麼這個子程序將進入僵死狀態,成為殭屍程序 實現殭屍程序 該程式為20秒的殭屍...