1樓:
父程序未結束,子程序先結束,會產生殭屍程序。
子程序在呼叫exit命令結束自己的生命的時候,其實它並沒有真正的被銷燬,而是留下一個稱為殭屍程序(zombie)的資料結構(系統呼叫 exit,它的作用是使程序退出,但也僅僅限於將一個正常的程序變成一個殭屍程序,並不能將其完全銷燬)。
即使是root身份kill -9也不能殺死殭屍程序。補救辦法是殺死殭屍程序的父程序(殭屍程序的父程序必然存在),殭屍程序成為"孤兒程序",過繼給1號程序init,init始終會負責清理殭屍程序。
殭屍程序的避免:
(1) 父程序通過wait和waitpid等函式等待子程序結束,這會導致父程序掛起。
(2) 如果父程序很忙,那麼可以用signal函式為sigchld安裝handler,因為子程序結束後, 父
程序會收到該訊號,可以在handler中呼叫wait**。
(3) 如果父程序不關心子程序什麼時候結束,那麼可以用signal(sigchld, sig_ign) 通知內
核,自己對子程序的結束不感興趣,那麼子程序結束後,核心會**, 並不再給父程序傳送
訊號。(4) 還有一些技巧,就是fork兩次,父程序fork一個子程序,然後繼續工作,子程序fork一 個孫進
程後退出,那麼孫程序被init接管,孫程序結束後, init會**。不過子程序的** 還要自己
做。 建議你使用第三種方法,父程序直接忽略子程序的結束,留給核心作**處理。這樣就不
會產生殭屍程序。
2樓:萬年長長青
linux 父程序關閉子程序
3樓:匿名使用者
採用ps + grep + awk + pkill命令組合,可實現「結束由一個父程序產生的所有子程序」,如:
父程序名為 parent_proc,可先根據程序名稱,得到程序pidps -ef |grep parent_proc|egrep -v grep | awk ''
根據父程序pid終止所有子程序pid,保留父程序pkill -9 -p $p_pid
完整指令碼:
for p_pid in `ps -ef |grep parent_proc|egrep -v grep | awk ''`
dopkill -9 -p $p_pid
done
有關各命令的詳情介紹請查閱相關參考資料。
4樓:匿名使用者
killall命令殺死同一程序組內的所有程序。它要指定要終止的程序的名稱,而非pid。
5樓:匿名使用者
killall 能行嗎
在linux中,用fork函式產生一個新的子程序,子程序結束後,子程序就成為了殭屍程序?
6樓:大大蟲
殭屍程序的避免
⒈父程序通過wait和waitpid等函式等待子程序結束,這會導致父程序掛起。
⒉ 如果父程序很忙,那麼可以用signal函式為sigchld安裝handler,因為子程序結束後, 父程序會收到該訊號,可以在handler中呼叫wait**。
⒊ 如果父程序不關心子程序什麼時候結束,那麼可以用signal(sigchld,sig_ign) 通知核心,自己對子程序的結束不感興趣,那麼子程序結束後,核心會**, 並不再給父程序傳送訊號。
⒋ 還有一些技巧,就是fork兩次,父程序fork一個子程序,然後繼續工作,子程序fork一 個孫程序後退出,那麼孫程序被init接管,孫程序結束後,init會**。不過子程序的** 還要自己做。
在linux中,用fork函式產生一個新的子程序,子程序結束後,子程序就成為了殭屍程序?
7樓:大大蟲
殭屍程序的避免
⒈父程序通過wait和waitpid等函式等待子程序結束,這會導致父程序掛起。
⒉ 如果父程序很忙,那麼可以用signal函式為sigchld安裝handler,因為子程序結束後, 父程序會收到該訊號,可以在handler中呼叫wait**。
⒊ 如果父程序不關心子程序什麼時候結束,那麼可以用signal(sigchld,sig_ign) 通知核心,自己對子程序的結束不感興趣,那麼子程序結束後,核心會**, 並不再給父程序傳送訊號。
⒋ 還有一些技巧,就是fork兩次,父程序fork一個子程序,然後繼續工作,子程序fork一 個孫程序後退出,那麼孫程序被init接管,孫程序結束後,init會**。不過子程序的** 還要自己做。
在linux中,iff,在linux中,iff1的含義
這是一個判斷語句的頭半句,意思是 將一個檔案普通名傳給傳給 1,並判斷這個檔案是否存在。後半句應該還有 then.存在應該怎樣做 和else.不存在應該怎樣做。linux 中 1什麼意思?比如 if test z 1這個名命令啥子作用?1在shell中稱為 位置引數 表示傳入的第1個引數 第1個入參...
在linux中如何在當前目錄中建立到var目錄中的軟連線
1 首先,連線相應linux主機,進入到linux命令列狀態下,等待輸入shell指令。2 在linux命令列下輸入shell指令 ln s var test。3 最後,按下回車鍵執行shell指令,此時會看到成功建立了一個 var test軟連結到當前目錄。命令 ln s var linkdir ...
linux 如何修改使用者的密碼,linux中如何修改指定使用者的密碼
1 首先,要用crt軟體連線linux系統。2 首選,確認是用root使用者登入系統的。輸入命令 id 檢視登入使用者資訊。3 若修改root自己的密碼,直接輸入 passwd 輸入兩遍,新密碼即可。4 若修改其他使用者,如oracle 的密碼,可直接輸入passwd oracle.輸入兩遍性新密碼...