zombie英文全稱是zombie process,,中文名為僵尸進(jìn)程,,也就是死掉的進(jìn)程,那么Linux中產(chǎn)生zombie的原因是什么?具體內(nèi)容請(qǐng)看下文,。 僵尸進(jìn)程,,英文名zombie process,顧名思義就是死掉的進(jìn)程,。 僵尸進(jìn)程產(chǎn)生的原因就是父進(jìn)程產(chǎn)生子進(jìn)程后,,子進(jìn)程先于父進(jìn)程退出,但是父進(jìn)程由于種種原因,,并沒(méi)有處理子進(jìn)程發(fā)送的退出信號(hào),,那么這個(gè)子進(jìn)程就會(huì)成為僵尸進(jìn)程。 這個(gè)是所謂的zombie是指在fork()/execve()過(guò)程中,,假設(shè)子進(jìn)程結(jié)束時(shí)父進(jìn)程仍存在,,而父進(jìn)程fork()之前既沒(méi)安裝SIGCHLD信號(hào)處理函數(shù)調(diào)用waitpid()等待子進(jìn)程結(jié)束,又沒(méi)有顯式忽略該信號(hào),,則子進(jìn)程成為僵尸進(jìn)程,,無(wú)法正常結(jié)束,此時(shí)即使是root身份kill-9也不能殺死僵尸進(jìn)程,。補(bǔ)救辦法是殺死僵尸進(jìn)程的父進(jìn)程,,僵尸進(jìn)程成為孤兒進(jìn)程,過(guò)繼給1號(hào)進(jìn)程init,,init始終會(huì)負(fù)責(zé)清理僵尸進(jìn)程,。 僵尸進(jìn)程是指的父進(jìn)程已經(jīng)退出,而該進(jìn)程dead之后沒(méi)有進(jìn)程接受,,就成為僵尸進(jìn)程 解決方法: 1,、父進(jìn)程通過(guò)wait和waitpid等函數(shù)等待子進(jìn)程結(jié)束,這會(huì)導(dǎo)致父進(jìn)程掛起,。執(zhí)行wait()或waitpid()系統(tǒng)調(diào)用,,則子進(jìn)程在終止后會(huì)立即把它在進(jìn)程表中的數(shù)據(jù)返回給父進(jìn)程,此時(shí)系統(tǒng)會(huì)立即刪除該進(jìn)入點(diǎn),。在這種情形下就不會(huì)產(chǎn)生defunct進(jìn)程,。 2,、如果父進(jìn)程很忙,,那么可以用signal函數(shù)為SIGCHLD安裝handler。在子進(jìn)程結(jié)束后,,父進(jìn)程會(huì)收到該信號(hào),,可以在handler中調(diào)用wait回收。 3,、如果父進(jìn)程不關(guān)心重點(diǎn)內(nèi)容子進(jìn)程什么時(shí)候結(jié)束,,那么可以用signal(SIGCLD, SIG_IGN)或signal(SIGCHLD, SIG_IGN)通知內(nèi)核,自己對(duì)子進(jìn)程的結(jié)束不感興趣,那么子進(jìn)程結(jié)束后,,內(nèi)核會(huì)回收,,并不再給父進(jìn)程發(fā)送信號(hào)。 4,、fork兩次,,父進(jìn)程fork一個(gè)子進(jìn)程,然后繼續(xù)工作,,子進(jìn)程fork一個(gè)孫進(jìn)程后退出,,那么孫進(jìn)程被init接管,孫進(jìn)程結(jié)束后,,init會(huì)回收,。不過(guò)子進(jìn)程的回收還要自己做。 |
|
來(lái)自: 老男孩IT教育 > 《Linux培訓(xùn)》