先看下面的**
1 #include2 #include3 #include4 #include5 #include6 int main()
7 15 else if(pid==0)//子程序
16
22 else//父程序
23
27 28 return 0;
29 }
看執行結果以及程序狀態
殭屍程序的產生與危害:
產生原因:
子程序先於父程序退出,父程序沒有讀取到子程序的退出碼,導致子程序
無法退出,資源得不到釋放,此時會處於殭屍程序。
危害:首先子程序和父程序是乙個非同步的過程,子程序退出時,父程序如果沒有呼叫wait()或waitpid()介面會導致資源一直得不到釋放,對於一台伺服器,程序號有限,如果伺服器有大量的程序號處於殭屍狀態,正常的程序可能無法建立,此時後果比較嚴重。
殭屍程序的避免:
⒈父程序通過wait和waitpid等函式等待子程序結束,這會導致父程序掛起。
⒉ 如果父程序很忙,那麼可以用signal函式為sigchld安裝handler,因為子程序結束後, 父程序會收到該訊號,可以在handler中呼叫wait**。
⒊ 如果父程序不關心子程序什麼時候結束,那麼可以用signal(sigchld,sig_ign) 通知核心,自己對子程序的結束不感興趣,那麼子程序結束後,核心會**, 並不再給父程序傳送訊號。
⒋ 還有一些技巧,就是fork兩次,父程序fork乙個子程序,然後繼續工作,子程序fork一 個孫程序後退出,那麼孫程序被init接管,孫程序結束後,init會**。不過子程序的** 還要自己做。
孤兒程序
老規矩先看**
1 #include2 #include3 #include4 #include5 #include6
7 int main()
8 16 else if(pid==0)//子程序
17
21 else//父程序
22
27 return 0;
28 }
執行結果
呼叫指令ps axj | grep +生成可執行檔名
● 父程序提前退出,那麼子程序退出時,進入z之後會被"1"號init程序領養,要有init程序**。
孤兒程序 殭屍程序
殭屍程序和孤兒程序 殭屍程序 殭屍程序是乙個比較特殊的狀態,當程序退出並且父程序沒有讀取到子程序的退出碼,就會產生殭屍程序,殭屍程序會一直儲存在程序表中,並且一直等待父程序讀取退出狀態碼。所以,只要子程序退出,父程序還在執行,但是父程序沒有讀取到子程序的狀態,子程序就會進入殭屍狀態。建立乙個殭屍程序...
殭屍程序, 孤兒程序
一,定義 當程序退出並且父程序 使用wait 系統呼叫 沒有讀取到子程序退出的返回 時就會產生殭屍程序。殭屍程序會以終止狀態保持在程序表中,並且會一直在等待父程序讀取退出狀態 簡單來說就是,在父程序中有乙個子程序,該子程序完成父程序交給的任務,子程序完成後會給父程序乙個任務結果返回,但父程序一直沒有...
殭屍程序 孤兒程序
程序在之前分為3個狀態 1.執行狀態 running 正在cpu中執行的程序。2.就緒狀態 ready 已獲得除了處理器外的所需資源,隨時準備著執行的程序。3.阻塞狀態 blocked 因為缺少除了cpu外的其他資源,無法滿足執行條件的程序。殭屍程序 乙個程序使用fork建立子程序,如果子程序退出,...