殭屍程序, 孤兒程序

2021-08-14 08:09:25 字數 1422 閱讀 7563

一,定義

當程序退出並且父程序(使用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...