原因以及如何避免产生僵尸进程
假設(shè)子進(jìn)程的父進(jìn)程退出, 同時(shí),他們沒(méi)叫父進(jìn)程wait/waitpid。子進(jìn)程將成為僵尸進(jìn)程。
經(jīng)ps命令,我們可以看到的過(guò)程的狀態(tài)Z(他代表死亡)。
一般。為了防止產(chǎn)生僵尸進(jìn)程。在fork子進(jìn)程之后我們都要wait它們。同一時(shí)候,當(dāng)子進(jìn)程退出的時(shí)候,內(nèi)核都會(huì)給父進(jìn)程一個(gè)SIGCHLD信號(hào)。所以我們能夠建立一個(gè)捕獲SIGCHLD信號(hào)的信號(hào)處理函數(shù),在函數(shù)體中調(diào)用wait(或waitpid)。就能夠清理退出的子進(jìn)程以達(dá)到防止僵尸進(jìn)程的目的。
正確的解決的方法是調(diào)用waitpid而不是wait。這個(gè)辦法的方法為:信號(hào)處理函數(shù)中,在一個(gè)循環(huán)內(nèi)調(diào)用waitpid。以獲取全部已終止子進(jìn)程的狀態(tài)。我們必須指定WNOHANG選項(xiàng)。他告知waitpid在有尚未終止的子進(jìn)程在執(zhí)行時(shí)不要堵塞。(我們不能在循環(huán)內(nèi)調(diào)用wait,由于沒(méi)有辦法防止wait在尚有未終止的子進(jìn)程在執(zhí)行時(shí)堵塞,wait將會(huì)堵塞到現(xiàn)有的子進(jìn)程中第一個(gè)終止為止)。
符合POSIX的系統(tǒng)信號(hào)處理總結(jié):
??????????????? 1. 一旦安裝了信號(hào)處理函數(shù),它便一直安裝者(較早期的系統(tǒng)是每運(yùn)行一次就將其拆除)。
??????????????? 2. 在一個(gè)信號(hào)處理函數(shù)執(zhí)行期間,正被遞交的信號(hào)是堵塞的。
??????????????? 3. 假設(shè)一個(gè)信號(hào)在被堵塞期間產(chǎn)生了一次或多次,那么該信號(hào)被解堵塞之后通常僅僅遞交一次,也就是說(shuō)Unix信號(hào)缺省是不排隊(duì)的。
??????????????? 4. 利用sigprocmask函數(shù)選擇性地堵塞或解堵塞一組信號(hào)是可能的。這使得我們能夠做到在一段臨界區(qū)代碼運(yùn)行期間,防止捕獲某些信號(hào)。以此保護(hù)這段代碼。
??????????
?
版權(quán)聲明:本文博主原創(chuàng)文章。博客,未經(jīng)同意不得轉(zhuǎn)載。
轉(zhuǎn)載于:https://www.cnblogs.com/mfrbuaa/p/4909499.html
總結(jié)
以上是生活随笔為你收集整理的原因以及如何避免产生僵尸进程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: web前端之HTML中的div
- 下一篇: 转载:每一个程序员要遵守的一些优秀编程风