殭屍程序
:乙個子程序在其父程序還沒有呼叫wait()或waitpid()的情況下退出。這個子程序就是殭屍程序。
孤兒程序
:乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作。
殭屍程序將會導致資源浪費,而孤兒則不會。
每個程序結束的時候,系統都會掃瞄當前系統中所執行的所有程序,看有沒有哪個程序是剛剛結束的這個程序的子程序,如果是的話,就由init來接管他,成為他的父程序。
乙個程序在呼叫
exit
命令結束自己的生命的時候,其實它並沒有真正的被銷毀,
而是留下乙個稱為殭屍程序(
zombie
)的資料結構(系統呼叫
exit
,它的作用是
使程序退出,但也僅僅限於將乙個正常的程序變成乙個殭屍程序,並不能將其完全銷毀)。
直到父程序通過wait / waitpid來取時才釋放. 但這樣就導致了問題,如果你程序不呼叫wait / waitpid的話, 那麼保留的那段資訊就不會釋放,其程序號就會一定被占用,但是系統所能使用的程序號是有限的,如果大量的產生殭屍程序,將因為沒有可用的程序號而導致系統不能產生新的程序. 此即為殭屍程序的危害,應當避免.
殭屍程序的避免
1、父程序通過wait和waitpid等函式等待子程序結束,這會導致父程序掛起
2. 如果父程序很忙,那麼可以用signal函式為sigchld安裝handler,因為子程序結束後, 父程序會收到該訊號,可以在handler中呼叫wait**
3. 如果父程序不關心子程序什麼時候結束,那麼可以用signal(sigchld, sig_ign) 通知核心,自己對子程序的結束不感興趣,那麼子程序結束後,核心會**, 並不再給父程序傳送訊號
4. 還有一些技巧,就是fork兩次,父程序fork乙個子程序,然後繼續工作,子程序fork一 個孫程序後退出,那麼孫程序被init接管,孫程序結束後,init會**。不過子程序的** 還要自己做。
子程序結束後為什麼要進入殭屍狀態?
因為父程序可能要取得子程序的退出狀態等資訊。
殭屍狀態是每個子程序比經過的狀態嗎?
是的。任何乙個子程序
(init除外)
在exit()
之後,並非馬上就消失掉,而是留下乙個稱為殭屍程序
(zombie)
的資料結構,等待父程序處理。這是每個
子程序在結束時都要經過的階段。
例子:
#include #include #include #include main()
else
}# ./a.out //執行程式的一條命令
children bye!
# i'm a orphan
對於父程序,fork函式返回了子程式的程序號,而對於子程式,fork函式則返回零。這樣,對於程式,只要判斷fork函式的返回值,就知道自己是處於父程序還是子程序中。
到底哪個程序先被排程也不知道.這也是系統內部的事情 。
殭屍程序和孤兒程序
什麼是殭屍程序?乙個子程序在其父程序沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。如果其父程序還存在而一直不呼叫wait,則該殭屍程序將無法 等到父程序結束後,會被init 驗證 include include includeint main 3秒後查詢其程序資訊 通過上...
殭屍程序和孤兒程序
殭屍程序和孤兒程序 在unix系統程式設計中,常常會碰到兩個概念 僵死程序和孤兒程序 僵死程序 在unix程序模型中,程序是按照父程序產生子程序,子程序產生子子程序這樣的方式建立出完成各項相互協作功能的程序的。當乙個程序完成它的工作終止之後,它的父程序需要呼叫wait 或者waitpid 系統呼叫取...
殭屍程序和孤兒程序
孤兒程序 乙個父程序退出,而他的乙個或多個子程序還在執行,那麼那些子程序將會成為孤兒程序。孤兒程序將被init程序 程序號為1 所收養,並由init程序對他們完成狀態收集工作。殭屍程序 乙個子程序在其父程序還沒有呼叫 wait 或 waitpid 的情況下退出。這個子程序就是殭屍程序。還有一種情況就...