Linux的殭屍程序處理1

2022-08-03 00:21:13 字數 2004 閱讀 7950

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 等待子程序結束,又沒有顯式忽略該訊號,...