- process 結束後要等 parent process 讀取它的 exit status 才能結束, 在那之前, 會進入 Zombie 狀態 (ps 顯示 Z)。
- Zombie 不會占用 memory, 只是在 process table 裡留筆記錄, 所以挺多會用光 process id 而無法新增 process。
- Zombie 不是 process, 自然也不能接受 signal, 所以無法 kill zombie (geek 的雙關笑話嗎...)。
避免 Zombie 的解法:
- 用 double fork, 也就是不直接將工作交給 child process, 而是先 fork child process, 讓它再 fork 出 "child child process"。接著 parent process 會 wait child process, 而 child process 不等待 "child child process" 直接結束, 所以 parent process 也不會等多久就能繼續做事。依 Unix 的設計, 因為 "child child process" 的 parent process 掛了, 它會自動被 init 接管, 而 init 會定期讀取 child process 的 exit status。
- 另外就是 Wikipedia 上寫的, 我沒試過這招:
if the parent explicitly ignores SIGCHLD by setting its handler to SIG_IGN (rather than simply ignoring the signal by default) or has the SA_NOCLDWAIT flag set, all child exit status information will be discarded and no zombie processes will be left.
沒有留言:
張貼留言