
我正在編輯這個問題,因為它被標記為重複的另一個關於如何殺死殭屍進程的問題。
我不是尋找如何殺死殭屍進程的答案。我的系統上沒有殭屍,我知道殭屍是如何創建的。
讓我嘗試重新表達這個問題。目前,以下是消除殭屍的公認方法:
向父級發送 SIGCHLD。理論上有效,但在實踐中並不總是有效,因為殭屍最初被創建的原因之一可能是因為父進程沒有正確回應 SIGCHLD。
殺死父進程。
- 修復了創建殭屍的程式中的錯誤。
- 重新啟動。
或如所提到的這裡
或者出於這個原因,@richard 在編輯之前對我的問題的評論中提到了這一點:
..to prevent the pid being reused. The parent has the pid of the child and may signal the child (may try to kill it), just from the pid it recieved when it created the child. It would be bad for the pid to be reused. Therefore the child remains in a zombie state until the parent acknowledges the death of the child, or the parent dies.
現在我的問題是:
為什麼沒有直接的方法來清理一個或多個殭屍。
如果殭屍可以用訊號殺死,會產生什麼副作用/後果?
是什麼阻止 *NIX 維護者創建清理殭屍的信號或命令(我很抱歉,如果「創建新信號」這句話在技術上不可接受)。
答案1
該進程當時已經死了。再殺也沒意義了。它仍然記錄在進程表中,以允許父 ti 取得其狀態。
請注意,所有行程被殺後都會變成殭屍。您只是看不到它們,因為大多數父進程都會很快清理其子進程。如果軟體沒有清理其殭屍程式並且它們只能透過以下方式清理,您可能需要提交錯誤報告在裡面一旦父進程退出。
您的附加問題是為什麼SIGKILL
不將其從進程表中刪除。您應該先告訴我們為什麼應該這樣做。我不知道有什麼理由讓使用者從進程表中刪除已失效的進程。在作業系統設計中,你應該總是有一個做某事的好理由在你問之前為什麼不這樣做。您要求的功能沒有實際用例。
除了缺乏目的之外,它還會帶來不好的後果。家長致電wait()
和/或waitpid()
了解退出孩子的狀態。無論是在進程變成之前調用,調用的結果都是一致的不復存在的,在發出 之前SIGKILL
,或之後。
如果核心不保留記錄(即進程將從進程表中刪除),則行為將必須不一致,並且父級將不得不預料到這種不一致並無正當理由地處理它。在重複使用舊的系統中PID值,不保留記錄可能會導致更嚴重的問題,例如軟體意外殺死完全不同的進程。