0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是僵尸進(jìn)程_Linux僵尸進(jìn)程可以被“殺死”嗎?

Linux閱碼場 ? 來源:網(wǎng)絡(luò)整理 ? 作者:工程師陳翠 ? 2018-07-28 10:09 ? 次閱讀

什么是僵尸

首先要明確一點(diǎn),僵尸進(jìn)程的含義是:子進(jìn)程已經(jīng)死了,但是父進(jìn)程還沒有wait它的一個中間狀態(tài),這個時候子進(jìn)程是一個僵尸。正常情況下子死,父wait,清理掉子進(jìn)程的task_struct,釋放子進(jìn)程的PID:

什么是僵尸進(jìn)程_Linux僵尸進(jìn)程可以被“殺死”嗎?

編譯上述程序,運(yùn)行,我們看到2個a.out進(jìn)程:

什么是僵尸進(jìn)程_Linux僵尸進(jìn)程可以被“殺死”嗎?

殺死子進(jìn)程4578,看到父進(jìn)程的打?。?/p>

什么是僵尸進(jìn)程_Linux僵尸進(jìn)程可以被“殺死”嗎?

之后,4578會消失,因?yàn)楦高M(jìn)程執(zhí)行到了wait,也知道了子進(jìn)程是被信號2殺掉的。

但是如果子進(jìn)程死了,父進(jìn)程不執(zhí)行到wait,比如把上圖中的"#if 0"改為"#if 1",殺死子進(jìn)程后,子進(jìn)程就是一個僵尸:

什么是僵尸進(jìn)程_Linux僵尸進(jìn)程可以被“殺死”嗎?

我們重新運(yùn)行,當(dāng)我們用kill -2殺掉子進(jìn)程4628后,我們發(fā)現(xiàn)4628成為一個僵尸,狀態(tài)變?yōu)閆+,名字上也加了一個棺材[],成為[a.out]:

什么是僵尸進(jìn)程_Linux僵尸進(jìn)程可以被“殺死”嗎?

僵尸不可能被殺死

我們看到上面4628是個僵尸很不爽,所以我們想把它干掉,據(jù)說Linux有個信號9,神擋殺神,佛擋殺佛,我們現(xiàn)在來用kill -9干掉4628:

什么是僵尸進(jìn)程_Linux僵尸進(jìn)程可以被“殺死”嗎?

從上圖可以看出,我們把4628用kill -9捅了好多刀,但是最后看4628這個僵尸,還是沒有消失。

因?yàn)榻┦呀?jīng)是死了,它不可能再次被殺死,你給它捅一萬刀,它也是個死人,不可能再次死!

僵尸不可能被殺死,因?yàn)樗呀?jīng)死了!只等父進(jìn)程來wait清理尸體了。

一個僵尸可以被殺死的假象

下面的這個程序證明“僵尸可以被殺死”:

什么是僵尸進(jìn)程_Linux僵尸進(jìn)程可以被“殺死”嗎?

我們在主線程里面,pthread_create()創(chuàng)建線程后,pthread_exit()退出,這個時候我們會發(fā)現(xiàn),在ps命令里面,a.out顯示為一個僵尸:

什么是僵尸進(jìn)程_Linux僵尸進(jìn)程可以被“殺死”嗎?

這個時候我們來殺死4730這個僵尸:

kill -9 4730

我們會驚奇地發(fā)現(xiàn),4730真地會從ps命令里面消失!

什么是僵尸進(jìn)程_Linux僵尸進(jìn)程可以被“殺死”嗎?

我們把時間軸拉回調(diào)用"kill -9 4730"之前。剛才我們“看起來”能殺死僵尸的本質(zhì)原因是,當(dāng)主線程4730調(diào)用pthread_exit()退出后,主線程4730的狀態(tài)確實(shí)是僵尸了,但是該進(jìn)程里面的4731線程,卻沒有死:

什么是僵尸進(jìn)程_Linux僵尸進(jìn)程可以被“殺死”嗎?

什么是僵尸進(jìn)程_Linux僵尸進(jìn)程可以被“殺死”嗎?

看看4731:

什么是僵尸進(jìn)程_Linux僵尸進(jìn)程可以被“殺死”嗎?

4731是活著的,證明整個進(jìn)程并沒有掛。

那么,根據(jù)POSIX標(biāo)準(zhǔn)關(guān)于信號(signal)的定義,當(dāng)我們執(zhí)行kill -9 4730(4730是4730和4731的TGID,也是整個進(jìn)程用戶態(tài)視角的PID)的時候,是要?dú)⑺勒麄€4730進(jìn)程的,所以這個時候4731被我們殺死,整個進(jìn)程就都死了,這個時候,執(zhí)行到父進(jìn)程的wait邏輯,導(dǎo)致僵尸消失。

所以,在本例中,kill -9 4730看起來是"殺死了僵尸”,實(shí)際是殺死了4731,導(dǎo)致整個進(jìn)程死

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11207

    瀏覽量

    208717

原文標(biāo)題:宋寶華: Linux僵尸進(jìn)程可以被“殺死”嗎?

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Linux系統(tǒng)下進(jìn)程的幾種狀態(tài)介紹

    文章對 Linux 系統(tǒng)下進(jìn)程的幾種狀態(tài)進(jìn)行介紹,并對系統(tǒng)出現(xiàn)大量僵尸進(jìn)程和不可中斷進(jìn)程的場景進(jìn)行分析,使用常用的幾種工具進(jìn)行問題分析定位。
    發(fā)表于 11-24 16:15 ?1.2w次閱讀
    <b class='flag-5'>Linux</b>系統(tǒng)下<b class='flag-5'>進(jìn)程</b>的幾種狀態(tài)介紹

    Linux學(xué)習(xí)雜談】之進(jìn)程狀態(tài)

    正在運(yùn)行,也就是就緒態(tài)的進(jìn)程進(jìn)入運(yùn)行的一個狀態(tài),得到CPU的執(zhí)行權(quán)限3.僵尸態(tài) 僵尸態(tài)就是進(jìn)程結(jié)束了,但是相應(yīng)的資源沒有
    發(fā)表于 09-27 00:36

    孤兒進(jìn)程僵尸進(jìn)程

    ,并可以用ps命令去查看,它的狀態(tài)是“Z”。三.解決方案1)kill殺死元兇父進(jìn)程(一般不用)嚴(yán)格的說,僵尸進(jìn)程并不是問題的根源,罪魁禍?zhǔn)资?/div>
    發(fā)表于 11-29 14:08

    Linux下的進(jìn)程結(jié)構(gòu)

    調(diào)試器暫停。當(dāng)一個進(jìn)程另一個進(jìn)程監(jiān)控時(如調(diào)試器使用ptrace()系統(tǒng)調(diào)用監(jiān)控測試程序),任何信號都可以把這個進(jìn)程置于跟蹤狀態(tài)。 ●
    發(fā)表于 05-27 09:24

    什么是僵尸進(jìn)程和孤兒進(jìn)程

    在UNIX里,除了進(jìn)程0(即PID=0的交換進(jìn)程,Swapper Process)以外的所有進(jìn)程都是由其他進(jìn)程使用系統(tǒng)調(diào)用fork創(chuàng)建的,這里調(diào)用fork創(chuàng)建新
    發(fā)表于 08-02 08:36

    為什么會出現(xiàn)LINUX僵尸進(jìn)程

    僵尸進(jìn)程出現(xiàn)在父進(jìn)程沒有回收子進(jìn)程的PCB的時候,這個時候子進(jìn)程已經(jīng)結(jié)束,但是父進(jìn)程沒有回收他,
    發(fā)表于 08-07 06:48

    進(jìn)程有幾種狀態(tài)?

    ?線程間同步方法有哪些?什么是內(nèi)核線程和用戶線程?內(nèi)核線程和用戶線程的區(qū)別?內(nèi)核線程和用戶線程有什么優(yōu)缺點(diǎn)?什么是僵尸進(jìn)程,孤兒進(jìn)程,守護(hù)進(jìn)程?僵尸
    發(fā)表于 12-24 07:16

    僵尸進(jìn)程的產(chǎn)生介紹和危害以及解決方法

    如果你經(jīng)常使用 Linux,你應(yīng)該遇到這個術(shù)語“僵尸進(jìn)程Zombie Processes”。 那么什么是僵尸進(jìn)程? 它們是怎么產(chǎn)生的? 它們
    的頭像 發(fā)表于 12-18 15:56 ?5738次閱讀
    <b class='flag-5'>僵尸</b><b class='flag-5'>進(jìn)程</b>的產(chǎn)生介紹和危害以及解決方法

    你知道僵尸進(jìn)程是個什么東西?

    在UNIX系統(tǒng)中,僵尸進(jìn)程是指完成執(zhí)行(通過exit系統(tǒng)調(diào)用,或運(yùn)行時發(fā)生致命錯誤或收到終止信號所致)但在操作系統(tǒng)的進(jìn)程表中仍然有一個表項(xiàng)(進(jìn)程控制塊PCB),處于”終止?fàn)顟B(tài)“的
    發(fā)表于 04-22 17:50 ?1236次閱讀

    Linux 系統(tǒng)中僵尸進(jìn)程

    不合理,父進(jìn)程從不調(diào)用 wait 等系統(tǒng)調(diào)用來收集僵尸進(jìn)程,那么這些進(jìn)程會一直存在內(nèi)存中。在 Linux 下,我們
    發(fā)表于 04-02 14:40 ?433次閱讀

    Linux數(shù)據(jù)中心服務(wù)器上的僵尸進(jìn)程怎樣正確的處理

    。雖然僵尸進(jìn)程不像運(yùn)行中的流氓應(yīng)用程序那樣占用寶貴資源,但可能會構(gòu)成威脅。
    發(fā)表于 09-30 17:29 ?856次閱讀
    <b class='flag-5'>Linux</b>數(shù)據(jù)中心服務(wù)器上的<b class='flag-5'>僵尸</b><b class='flag-5'>進(jìn)程</b>怎樣正確的處理

    Linux僵尸進(jìn)程會被殺死嗎?

    那么,根據(jù)POSIX標(biāo)準(zhǔn)關(guān)于信號(signal)的定義,當(dāng)我們執(zhí)行kill -9 4730(4730是4730和4731的TGID,也是整個進(jìn)程用戶態(tài)視角的PID)的時候,是要殺死整個4730進(jìn)程的,所以這個時候4731被我們
    發(fā)表于 08-07 16:48 ?352次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>僵尸</b><b class='flag-5'>進(jìn)程</b>會被<b class='flag-5'>殺死</b>嗎?

    如何在Linux終止僵尸進(jìn)程

    在了解Zombie進(jìn)程之前,讓我回憶一下什么是進(jìn)程。簡而言之,進(jìn)程是程序?qū)嵗K?b class='flag-5'>可以是前臺的交互式進(jìn)程或后臺的非交互式或自動
    的頭像 發(fā)表于 12-12 17:40 ?2028次閱讀

    linux下開發(fā)避免僵尸進(jìn)程的方法

    一、什么是僵死進(jìn)程? 一般情況下,程序調(diào)用exit(包括_exit和_Exit,它們的區(qū)別這里不做解釋),它的絕大多數(shù)內(nèi)存和相關(guān)的資源已經(jīng)內(nèi)核釋放掉,但是在進(jìn)程表中這個進(jìn)程項(xiàng)(ent
    的頭像 發(fā)表于 11-11 16:38 ?685次閱讀
    <b class='flag-5'>linux</b>下開發(fā)避免<b class='flag-5'>僵尸</b><b class='flag-5'>進(jìn)程</b>的方法

    如何查看系統(tǒng)是否有僵尸進(jìn)程

    進(jìn)程中的指令已經(jīng)執(zhí)行完成,但是進(jìn)程PCB結(jié)構(gòu)還沒有回收。   即子進(jìn)程先于父進(jìn)程退出后,子進(jìn)程的PCB需要其父
    的頭像 發(fā)表于 11-29 15:52 ?6731次閱讀
    如何查看系統(tǒng)是否有<b class='flag-5'>僵尸</b><b class='flag-5'>進(jìn)程</b>