1.僵死程序與孤兒程序
僵死程序:程序已經退出,但是沒有**核心 pcb 資源的程序叫僵死程序。
孤兒程序:父親程序先於子程序退出後,這個子程序就是孤兒程序,父親程序會被轉移為 init(pid=1)程序。
僵死程序示例:
#include #include #include "apue.h"
#include void test(int i , void *arg)
int main(int argc,char *argv)
else if(pid == 0)
else
exit(0);
}
父程序sleep 20秒時,子程序已經退出,但是沒有**pcb資源(程序pcb資源由父程序**)。
孤兒程序示例:
#include #include #include "apue.h"
#include void test(int i , void *arg)
int main(int argc,char *argv)
else if(pid == 0)//子程序
else//父程序
return 0;
}
父程序比子程序
先退出了,子程序由pid==1的程序監管。
2.僵死程序
2.1僵死程序的原因及危害
乙個程序在呼叫exit命令結束自己的生命的時候,其實他並沒有真正的被銷毀,而是留下乙個稱為殭屍程序(zombie)的資料結構(系統呼叫exit,他的作用是使程序退出,但是也僅僅限於乙個正常的程序變成了乙個殭屍程序,並不能完全將其銷毀)。在linux程序的狀態中,殭屍程序是非常特殊的一種,它已經放棄了幾乎所有的記憶體空間,沒有任何可執行**,也不能被排程,僅僅在程序列表中保留乙個位置,記載該程序的退出狀態資訊供其他程序收集,除此之外,殭屍程序不再占有任何儲存空間。他需要他的父程序來為他收屍,如果他的父程序沒有安裝sigchld訊號處理函式呼叫wait 或 waitpid() 等待子程序結束,有沒有顯式忽略該訊號,那麼它就一直保持殭屍狀態,如果這時候父程序結束了,那麼init程序會自動接手這個子程序,為他收屍,他還是能被清除掉的。但是如果父程序是乙個迴圈,不會結束,那麼子程序就會一直保持殭屍狀態,這就是系統中為什麼有時候會有很多的殭屍程序。
由此看出,僵死程序並不會占用很多的資源。唯一的危害是影響了系統最大程序數,有可能造成後續程序無法分配資源。
2.2.僵死程序演示:
檢視僵死程序:ps auwx | cut -c 10-15,45-50,63- | grep -i z 檢視殭屍程序pid、名稱和程序路徑。
殭屍程序的狀態為z,如下圖的[first]
2.3.避免zombie的方法
1)在svr4中,如果呼叫signal或是sigset將sigchld的配置設定為忽略,則不會產生僵死子程序。另外,使用svr4版本sigaction,則可設定sa_nocldwait標誌以避免子程序僵死。linux中也可以使用這個,在乙個程式開始呼叫這個函式signal(sigchld,sig_ign);
2)呼叫fork兩次:第一次呼叫fork建立子程序,第二次呼叫建立孫子程序,當子程序退出後,不管父程序是否在迴圈執行,孫子程序都被init程序接手了,不會產生僵死程序。示例**:
#include#include "apue.h"
#include "fcntl.h"
#include #define buffsize 4096
int main(int argc,char *argv)
if(waitpid(pid,null,0)!=pid)//父程序:等待第乙個子程序退出
err_sys("fork error");
exit(0);
}
3)用waitpid等待子程序返回。
3.孤兒程序
學習筆記 孤兒程序僵死程序
include include include include include include 孤兒程序 int main void if pid 0 if 0 pid return 0 僵死程序 避免方法 建立子程序的時候可以不管子程序,讓linux核心去管 訊號 非同步處理事件,是一種機制.言外...
linux 中的僵死程序和孤兒程序
當我們使用建立程序的函式fork vfork 等,建立了子程序 1.子程序先於父親程序退出,會造成子程序的程序編號無法釋放.程序編號的範圍很大,但不應該隨意浪費 2.子程序後於父親程序退出,子程序會交給init 程序管理.3.乙個程序在執行完畢後,系統會自動清空其存在的程序的相關資源 結合上面說明,...
僵死程序和孤兒程序的產生和處理
1 僵死程序的產生 子程序先於父程序結束,這是需要父程序最子程序的pcb進行釋放,如果父程序沒有對已經結束的子程序進行pcb釋放,那麼該子程序就一直處於僵死狀態,如果父程序執行一段時間也結束了,那還好辦,init程序會接收這個僵死的子程序對其pcb進行釋放,但是如果父程序一直迴圈,那麼子程序就一直處...