在unix 系統中,乙個程序結束了,但是他的父程序沒有等待(呼叫wait / waitpid)他, 那麼他將變成乙個殭屍程序. 在fork()/execve()過程中,假設子程序結束時父程序仍存在,而父程序fork()之前既沒安裝sigchld訊號處理函式呼叫 waitpid()等待子程序結束,又沒有顯式忽略該訊號,則子程序成為殭屍程序。
兩種方法殺死殭屍程序,一般殭屍程序很難直接kill掉,不過您可以kill殭屍父程序。父程序死後,殭屍程序成為」孤兒程序」,過繼給1號程序init,init始終會負責清理殭屍程序.它產生的所有殭屍程序也跟著消失。
(1)利用wait,waitpid函式來主動請求子程序的函式
* wait,waitpid函式
pid_t wait(int
*status);
pid_t waitpid(pid_t pid, int
*status, int options);
(2)利用sigaction函式進行訊號處理,通過註冊子程序觸發的sigchld訊號來
編寫相應的處理函式。
* 訊號sigaction函式和sigaction結構體結構
int sigaction(int sig, const
struct sigaction *restrict act, struct sigaction *restrict oact);
struct sigaction
;
act是新的訊號處理函式,oact是舊的處理函式一般為null
* **案例如下:
#include
#include
#include
#include
#include
#include
#include
#include
void handle(int signum)
}int main(int argc,char** argv)
std::cout
<<"wait!"
num--;
}}
其實最直接的方法下面**就可以做到**
void handle_child()
子程序終止的時候產生sigchld訊號,系統會用sig_ign函式來進行預設處理,
所以正常情況下只需要設定上面的**就可以了。
殭屍程序 處理
由於使用fork建立的子程序被kill以後,父程序沒有kill時,用ps檢視就會顯示該子程序 為殭屍程序。開始沒有設定signal sigchld,sig ign 然後在程式裡用system kill s 9 表示子程序號 執行之後發現子程序顯示為殭屍程序。但是直接在後台執行 kill s 9 再次...
殭屍程序的處理
利用kill函式 利用sigchld訊號 kill函式可以向某個程序或者程序組傳送特定的訊號。include include intkill pid t pid,int sig include include include void fun int sig intmain getchar wait...
Linux下殭屍程序的處理
category 工作學習 linux 2010.12.31 什麼是殭屍程序 殭屍程序是指它的父程序已經退出 父程序沒有等待 呼叫wait waitpid 它 而該程序dead之後沒有程序接受,就成為殭屍程序,也就是 zombie 程序。殭屍程序是怎麼樣產生 乙個程序在呼叫exit命令結束自己的生命...