在Unix主機上產生僵屍進程是比較頭痛的,因為僵屍進程是非常頑固的,用kill是沒有用的,因為它已經死了,要不怎麼叫僵屍呢?
如果僵屍進程由某個父進程產生,而父進程尚未退出,則僵屍進程會一直存在,用
ps –ef | grep
查一下,看看PPID是誰,父進程退出時一般僵屍也會被處理掉的,如果看到僵屍的父進程ID是1,這樣就很麻煩了,因為1是系統內核進程,是殺不掉的,所以只能重啟系統了,但生產環境下重新啟動都算作嚴重故障,後果很嚴重的,所以在寫程序時只能盡量避免出現僵屍進程。
AIX比較煩人的地方就是用popen打開的進程,在使用pclose關閉時不一定能把子進程wait掉,所以可能出現僵屍。
可以通過修改SIGCHLD的處理函數來忽略這個消息,這樣系統將會自動回收進程表,但是wait函數將會失效,如果想通過wait來判斷子進程是否退出就做不到了。根據實際應用場景來自行選擇如何處理。
#if defined(SIGCHLD)
signal(SIGCHLD,SIG_IGN);
#elif defined(SIGCLD)
signal(SIGCLD,SIG_IGN);
#endif
SIGCHLD、SIGCLD兩個消息是相同的,有些老的系統可能沒有定義前者可以使用後者。