linux中有兩種異常的程序:1.孤兒程序:應用通過fork程序後,父程序被kill或者exit,該父程序的子程序被1號程序接管。linux核心啟動時候回啟動0號程序,啟動完畢後0號程序就處於空閒狀態,所有的程序的父程序都是有1號程序fork出來的。
2.殭屍程序:fork操作出來的父子程序,子程序收到kil -9的操作或者exit的操作,子程序的記憶體和cpu資源被作業系統**,但是pcb塊還會在核心中。linux程序的控制是依靠pcb塊的,pcb塊記錄了程序的執行資訊,比如時間片,執行時間,記憶體資源等等。linux核心按照不同的程序狀態把程序放到不同的狀態的list中,每次核心會遍歷這些list執行對應的程序。
如下就是乙個簡單的例子,設計到了程序間管道通訊、訊號註冊,訊號處理。
#include #include
#include
#include
#include
#include
#include
#define tdata 888
void clear_up(int
sig) //收到exit或者kill -9的訊號,需要處理的事情
}void
exit_fuc()//收到sigint的訊號的處理
int main(void
)
int w_fd = fd[1
]; //管道中的fd[1]是寫的操作
int r_fd = fd[0
];//管道中的fd[0]的是讀操作
pid =fork(); //fork乙個子程序
assert(pid != -1
);
if(pid > 0
) ;
int c_sec = 0
;
while(1
)
sleep(2);}}
else
;
while(1
)
sleep(1);}}
return0;
}
執行結果:zhoulin@:~/code/c/demo:./tx1
i am a parent =39267,my child =7742
i am a child =39268,my parent =39267
zhoulin
39267
7742
020:52 pts/1
00:00:00 ./tx1 --父程序
zhoulin
39268
39267
020:52 pts/1
00:00:00 ./tx1 --子程序
i am a parent =39267,my child =7742
*********send 888******** 主程序傳送內容
********recive 888*********** 子程序接受內容zhoulin
39267
7742
020:52 pts/1
00:00:00 ./tx1 --父程序
zhoulin
39268
39267
020:52 pts/1
00:00:00 [tx1] --子程序進行了exit操作,linux核心中的pcb並沒有**
******recyle 39268 ok****** --主程序監聽到了kill 9的訊號,進行的wait操作,**了殭屍程序。i am a parent =39267,my child =7742 --此時再次列印的就只有父程序了
^c*********exit 39267****** --ctrl+c的傳送sigint的訊號,該訊號對應的函式exit_fuc的處理,就是退出父程序
Linux下殭屍程序的處理
category 工作學習 linux 2010.12.31 什麼是殭屍程序 殭屍程序是指它的父程序已經退出 父程序沒有等待 呼叫wait waitpid 它 而該程序dead之後沒有程序接受,就成為殭屍程序,也就是 zombie 程序。殭屍程序是怎麼樣產生 乙個程序在呼叫exit命令結束自己的生命...
殭屍程序 處理
由於使用fork建立的子程序被kill以後,父程序沒有kill時,用ps檢視就會顯示該子程序 為殭屍程序。開始沒有設定signal sigchld,sig ign 然後在程式裡用system kill s 9 表示子程序號 執行之後發現子程序顯示為殭屍程序。但是直接在後台執行 kill s 9 再次...
殭屍程序的處理
在unix 系統中,乙個程序結束了,但是他的父程序沒有等待 呼叫wait waitpid 他,那麼他將變成乙個殭屍程序.在fork execve 過程中,假設子程序結束時父程序仍存在,而父程序fork 之前既沒安裝sigchld訊號處理函式呼叫 waitpid 等待子程序結束,又沒有顯式忽略該訊號,...