天天看點

Unix/Linux系統中僵屍程序是如何産生的?有什麼危害?如何避免?

如題 Unix/Linux系統中僵屍程序是如何産生的?有什麼危害?如何避免?

一個程序在調用exit指令結束自己的生命的時候,其實他并沒有真正的被銷毀,而是留下一個稱為僵屍程序(Zombie)的資料結構(系統調用exit,他的作用是使程序退出,但是也僅僅限于一個正常的程序變成了一個僵屍程序,并不能完全将其銷毀)。在linux程序的狀态中,僵屍程序是非常特殊的一種,它已經放棄了幾乎所有的記憶體空間,沒有任何可執行代碼,也不能被排程,僅僅在程序清單中保留一個位置,記載該程序的退出狀态資訊供其他程序收集,除此之外,僵屍程序不再占有任何存儲空間。他需要他的父程序來為他收屍,如果他的父程序沒有安裝SIGCHLD信号處理函數調用wait 或 waitpid() 等待子程序結束,有沒有顯式忽略該信号,那麼它就一直保持僵屍狀态,如果這時候父程序結束了,那麼init程序會自動接手這個子程序,為他收屍,他還是能被清除掉的。但是如果父程序是一個循環,不會結束,那麼子程序就會一直保持僵屍狀态,這就是系統中為什麼有時候會有很多的僵屍程序。

避免zombie的方法

1)在svr4中,如果調用signal或是sigset将SIGCHLD的配置設定為忽略,則不會産生僵死子程序。另外,使用svr4版本sigaction,則可設定SA_NOCLDWAIT标志以避免子程序僵死。Linux中也可以使用這個,在一個程式開始調用這個函數signal(SIGCHLD,SIG_IGN);

2)調用fork兩次

3)用waitpid等待子程序傳回。

本文轉自NewPanderKing51CTO部落格,原文連結:http://www.cnblogs.com/newpanderking/p/3784328.html ,如需轉載請自行聯系原作者

繼續閱讀