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等待子進程返回。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM