解釋
乙個程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下乙個稱為殭屍程序(zombie)的資料結構(系統呼叫exit,它的作用是使程序退出,但是也僅僅限於將乙個正常的程序變成乙個殭屍程序,並不能將其完全銷毀)
程序的危害
由於子程序的結束和父程序的執行是乙個非同步過程,即父程序永遠無法**子程序到底什麼時候結束。那麼會不會因為父程序太忙來不及wait子程序,或者說不知道子程序什麼時候結束,而丟失子程序結束時的狀態資訊呢?不會。因為unix提供了一種機制可以保證只要父程序想知道子程序結束時的狀態資訊,就可以得到。這種機制就是:在每個程序退出的時候,核心釋放該程序的所有的資源,包括開啟的檔案,占用的記憶體等。但是仍然為其保留一定的資訊(包括程序號the process id,退出狀態the termination status of the process,執行時間the amount of cpu time taken by the process等)。直到父程序通過wait/waitpid來取時才釋放,但是這樣就導致了問題,如果程序不呼叫wait/waitpid的話,那麼保留的那段資訊就不會釋放,其程序號就會一直被占用,但是系統所能使用的程序號是有限的,如果大量的產生僵死程序,將因為沒有可用的程序號而導致系統不能產生新的程序。此即為殭屍程序的危害,應該避免。
殭屍程序的避免
1.父程序通過wait和waitpid等函式等待子程序結束,這回導致父程序掛起。
2.如果父程序很忙,那麼可以用signal函式為sigchld安裝handler,因為結束後,父程序會收到該訊號,可以在handler中呼叫wait**。
3.如果父程序不關心子程序什麼時候結束,那麼可以用signal(sigchld,sig_ign)通知核心,自己對子程序的結束不感興趣,那麼子程序結束後,核心會**,並不再父程序傳送訊號。
4.還有一些技巧,就是fork兩次,父程序fork乙個子程序,然後繼續工作,子程序fork乙個孫程序後退出,那麼孫程序被init接管,孫程序結束後,init會**。不過子程序的**還要自己做。
程序處理
它需要它的父程序來為它收屍,如果他的父程序沒安裝sigchld訊號處理函式呼叫wait或者waitpid()等待子程序結束,又沒有顯式忽略該訊號,那麼它就一直保持殭屍狀態;存在的問題:如果父程序是乙個迴圈,不hi結束,那麼子程序就會一直保持殭屍狀態,這就是為什麼系統中有時會有很多的殭屍程序,系統的效能可能會收到影響。如果這是父程序結束了,那麼init程序就會自動接受這個子程序,為它收屍,它還是能被清除的。
1.子程序結束後為什麼要進入殭屍狀態?
因為父程序可能要取得子程序的退出狀態等資訊。
2.殭屍狀態是每乙個子程序必經的狀態嗎?
是的。任何乙個子程序(init程序除外)在exit()之後,並非馬上就消失掉,而是留下乙個稱為殭屍程序(zombie)的資料結構,等待父程序處理。這是每個子程序在結束時都要經過的階段。如果子程序在exit()之後,父程序沒有來得及處理,這是用ps命令就能看到子程序的狀態是"z"。如果父程序能夠及時處理,可能用ps命令就來不及看到子程序的殭屍狀態,但這並不等於子程序不經過殭屍狀態。
3.如果父程序在子程序結束之前退出,則子程序將有init接管。init將會以父程序的身份對殭屍狀態的子程序進行處理
4.如何檢視殭屍程序?
$ps -el 其中,有標記為z的程序就是殭屍程序 s代表休眠狀態;d代表不可中斷的休眠狀態;r代表執行狀態;z代表僵死狀態;t代表停止或者跟蹤狀態
2.概述 假設
在fork()/execve()過程中,假設子程序結束時父程序仍存在,而父程序fork()之前既沒安裝sigchld訊號處理函式呼叫waitpid()等待子程序結束,又沒有顯式忽略該訊號,則子程序成為殭屍程序,無法正常結束,此時即使是root身份kill -9也不能殺死殭屍程序
補救方法
殺死殭屍程序的父程序(殭屍程序的父程序必然存在),殭屍程序成為「孤兒程序」,過繼給1號程序init,init始終會負責清理殭屍程序。
對Python shell的一些思考
對python shell的一些思考 就兩次指令碼處理的編碼練習而言,我感覺如果使用python去寫指令碼來處理日常事務的話,相對於shell是一件比較麻煩的事情,因為我可以使用shell在花費更少的時間內,比較熟練地使用awk sed和grep這些常用的命令在非常簡短的指令碼語句內,完成pytho...
對迷茫的一些思考
最近依然迷茫不安,從3月份開始嘗試去找工作,現在已經4月底,依然沒有著落。不是沒有好機會,而是自己能力不足,抓不住機會,於是自己很慌亂,發現不會或不擅長的東西,拼命在補,同時也在後悔為什麼當初沒有好好努力。然後也明白了一些道理。人們總說學習永遠不晚,其實是會晚的,會錯過很多時機,但時機是不會再次到來...
對程式設計的一些思考
1.程式 是程式設計思想的體現 我想程式設計人員在設計程式之初,肯定會有一番思考。思考主要是程式設計的目的,然後是實現目的的方法,最後才是 的實現。所以,程式 是程式設計思想的體現。分析 的啟示 我們分析程式 時,可以在看 之前,想想這個 要幹什麼事,然後再去看 就容易多了。程式設計的啟示 先思考程...