殭屍程序和處理方式

2021-07-31 18:16:33 字數 1412 閱讀 4569

在父程式中用於判斷子程式是否結束

殭屍程序

子程序提前于父程序結束,造成無法清理掉pcb和其他系統消耗造成pid的長時間占用(如上圖)

如果父程序異常結束時就成了乙個孤兒程序交個pid=1 的init作為父程序進行管理收屍;

三種處理方式

⒈父程序通過wait和waitpid等函式等待子程序結束,這會導致父程序掛起問題父程序在wait處會阻塞如果父程序很忙會造成一系列

#include #include #include #include #include int main()

else

int i=0;

for(;iwait();

}

return 0;

}

⒉ 如果父程序很忙,那麼可以用signal函式為sigchld安裝handler,因為子程序結束後, 父程序會收到該訊號,可以在handler中呼叫wait**。

第二種**(只要在父程序收到子程序結束的訊號時就去處理該訊號)

#include #include #include #include #include void fun(int sig)

int main()

else

int i=0;

for(;i

⒊ 如果

父程序不關心子程序什麼時候結束,那麼可以用signal(sigchld,sig_ign) 通知

核心,自己對子程序的結束不感興趣,那麼子程序結束後,核心會**, 並不再給父程序傳送訊號。

#include #include #include #include #include int main()

else

int i=0;

for(;i

還就是fork兩次,父程序fork乙個子程序,然後繼續工作,子程序fork一 個孫程序後退出,那麼孫程序被init接管,孫程序結束後,init會**。不過子程序的** 還要自己做。相比與第一種的好處就是父程序不用等因為子程序在父程序執行時很快就結束了;

#include

#include #include #include #include int main()

else

}else

wait(null);

int i=0;

for(;i

return 0;

}

Defunct程序處理方式

本文 下面談談 defunct 程序,中文翻譯叫殭屍程序。下文整理於網路以及apue一書。一 什麼是殭屍程序 在unix 系統中,乙個程序結束了,但是他的父程序沒有等待 呼叫wait waitpid 他,那麼他將變成乙個殭屍程序。當用ps命令觀察程序的執行狀態時,看到這些程序的狀態列為defunct...

殭屍程序 處理

由於使用fork建立的子程序被kill以後,父程序沒有kill時,用ps檢視就會顯示該子程序 為殭屍程序。開始沒有設定signal sigchld,sig ign 然後在程式裡用system kill s 9 表示子程序號 執行之後發現子程序顯示為殭屍程序。但是直接在後台執行 kill s 9 再次...

SIGCLD處理方式

apue上sigcld語義寫的有點不清楚,到底我們的系統是如何來處理sigcld訊號呢?1.sig dfl 預設的處理方式是不理會這個訊號,但是也不會丟棄子進行狀態,所以如果不用wait,waitpid 對其子進行進行狀態資訊 會產生殭屍程序。2.sig ign 忽略的處理方式,這個方式和預設的忽略...