一,定義
當程序退出並且父程序(使用wait()系統呼叫)沒有讀取到子程序退出的返回**時就會產生殭屍程序。殭屍程序會以終止狀態保持在程序表中,並且會一直在等待父程序讀取退出狀態**。
簡單來說就是,在父程序中有乙個子程序,該子程序完成父程序交給的任務,子程序完成後會給父程序乙個任務結果返回,但父程序一直沒有理會。使得子程序很尷尬的掛著,不能釋放,一直等父程序檢視結果,而產生的殭屍程序。
二,模擬實現乙個殭屍程序
test.c檔案
#include
#include
#include
int main(viod)
else
if(id==0)
else
}return
0;}
當我們執行該test.c程式時
gcc test.c -o test
./test
結果我們看到
注意項:
@1:子程序和父程序的執行先後是不確定的,由作業系統決定
@2:子程序先退出,父程序死迴圈切不去檢視子程序狀態。產生殭屍程序
@3:fork()失敗原因:1,程序數達到上限。2.資源不足
避免殭屍程序的方法
⒈父程序通過wait和waitpid等函式等待子程序結束,這會導致父程序掛起。
⒉ 如果父程序很忙,那麼可以用signal函式為sigchld安裝handler,因為子程序結束後, 父程序會收到該訊號,可以在handler中呼叫wait**。
⒊ 如果父程序不關心子程序什麼時候結束,那麼可以用signal(sigchld,sig_ign) 通知核心,自己對子程序的結束不感興趣,那麼子程序結束後,核心會**, 並不再給父程序傳送訊號。
⒋ 還有一些技巧,就是fork兩次,父程序fork乙個子程序,然後繼續工作,子程序fork一 個孫程序後退出,那麼孫程序被init接管,孫程序結束後,init會**。不過子程序的** 還要自己做。
1,產生原因:父程序先退出,子程序迴圈(子程序有1號程序領養)
二,模擬實現乙個殭屍程序
test.c檔案
#include
#include
#include
int main(viod)
else
if(id==0)//child
else//father
return
0;}
執行該程式
gcc test.c -o test
./test
發現child已經被1號程序領養 孤兒程序 殭屍程序
殭屍程序和孤兒程序 殭屍程序 殭屍程序是乙個比較特殊的狀態,當程序退出並且父程序沒有讀取到子程序的退出碼,就會產生殭屍程序,殭屍程序會一直儲存在程序表中,並且一直等待父程序讀取退出狀態碼。所以,只要子程序退出,父程序還在執行,但是父程序沒有讀取到子程序的狀態,子程序就會進入殭屍狀態。建立乙個殭屍程序...
殭屍程序 孤兒程序
程序在之前分為3個狀態 1.執行狀態 running 正在cpu中執行的程序。2.就緒狀態 ready 已獲得除了處理器外的所需資源,隨時準備著執行的程序。3.阻塞狀態 blocked 因為缺少除了cpu外的其他資源,無法滿足執行條件的程序。殭屍程序 乙個程序使用fork建立子程序,如果子程序退出,...
殭屍程序,孤兒程序
乙個殭屍程序的例子 乙個程序使用fork建立子程序,如果子程序退出,而父程序並沒有呼叫wait waitpid獲取子程序的狀態資訊,那麼子程序的程序描述符仍然儲存在系統中,這種程序就稱之為殭屍程序 1 include2 include3 include4 5 int main 6 13 else i...