天天看點

了解孤兒程序和僵屍程序的定義

當主程序建立的C、D子程序比父程序先結束,在fork ()/execve()過程中,假設子程序結束時父程序仍存在,而父程序fork()之前既沒安裝SIGCHLD信号處理函數調用waitpid()等待子程序結束,又沒有顯式忽略該信号,則子程序成為僵屍程序,無法正常結束,此時即使是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會回收。不過子程序的回收 還要自己做。

繼續閱讀