99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

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

科技綠洲 ? 來(lái)源:Linux開(kāi)發(fā)架構(gòu)之路 ? 作者:Linux開(kāi)發(fā)架構(gòu)之路 ? 2023-11-11 16:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、什么是僵死進(jìn)程?

一般情況下,程序調(diào)用exit(包括_exit和_Exit,它們的區(qū)別這里不做解釋?zhuān)慕^大多數(shù)內(nèi)存和相關(guān)的資源已經(jīng)被內(nèi)核釋放掉,但是在進(jìn)程表中這個(gè)進(jìn)程項(xiàng)(entry)還保留著(進(jìn)程ID,退出狀態(tài),占用的資源等等),你可能會(huì)問(wèn),為什么這么麻煩,直接釋放完資源不就行了嗎?這是因?yàn)橛袝r(shí)它的父進(jìn)程想了解它的退出狀態(tài)。在子進(jìn)程退出但還未被其父進(jìn)程“收尸”之前,該子進(jìn)程就是僵死進(jìn)程,或者僵尸進(jìn)程。如果父進(jìn)程先于子進(jìn)程去世,那么子進(jìn)程將被init進(jìn)程收養(yǎng),這個(gè)時(shí)候init就是這個(gè)子進(jìn)程的父進(jìn)程。

所以一旦出現(xiàn)父進(jìn)程長(zhǎng)期運(yùn)行,而又沒(méi)有顯示調(diào)用wait或者waitpid,同時(shí)也沒(méi)有處理SIGCHLD信號(hào),這個(gè)時(shí)候init進(jìn)程就沒(méi)有辦法來(lái)替子進(jìn)程收尸,這個(gè)時(shí)候,子進(jìn)程就真的成了“僵尸”了。

二、僵死進(jìn)程與孤兒進(jìn)程的區(qū)別?

回答這個(gè)問(wèn)題很簡(jiǎn)單,就是爸爸(父進(jìn)程)和兒子(子進(jìn)程)誰(shuí)先死的問(wèn)題!

如果當(dāng)兒子還在世的時(shí)候,爸爸去世了,那么兒子就成孤兒了,這個(gè)時(shí)候兒子就會(huì)被init收養(yǎng),換句話(huà)說(shuō),init進(jìn)程充當(dāng)了兒子的爸爸,所以等到兒子去世的時(shí)候,就由init進(jìn)程來(lái)為其收尸。

如果當(dāng)爸爸還活著的時(shí)候,兒子死了,這個(gè)時(shí)候如果爸爸不給兒子收尸,那么兒子就會(huì)變成僵尸進(jìn)程。

三、僵死進(jìn)程的危害?

  1. 僵死進(jìn)程的PID還占據(jù)著,意味著海量的子進(jìn)程會(huì)占據(jù)滿(mǎn)進(jìn)程表項(xiàng),會(huì)使后來(lái)的進(jìn)程無(wú)法fork.
  2. 僵死進(jìn)程的內(nèi)核棧無(wú)法被釋放掉(1K 或者 2K大?。瑸樯稌?huì)留著它的內(nèi)核棧,因?yàn)樵跅5淖畹投?,有著thread_info結(jié)構(gòu),它包含著 struct_task 結(jié)構(gòu),這里面包含著一些退出信息。

四、避免僵死進(jìn)程的方法

網(wǎng)上搜了下,總結(jié)有三種方方法:

① 程序中顯示的調(diào)用signal(SIGCHLD, SIG_IGN)來(lái)忽略SIGCHLD信號(hào),這樣子進(jìn)程結(jié)束后,由內(nèi)核來(lái)wai和釋放資源

② fork兩次,第一次fork的子進(jìn)程在fork完成后直接退出,這樣第二次fork得到的子進(jìn)程就沒(méi)有爸爸了,它會(huì)自動(dòng)被老祖宗init收養(yǎng),init會(huì)負(fù)責(zé)釋放它的資源,這樣就不會(huì)有“僵尸”產(chǎn)生了

③ 對(duì)子進(jìn)程進(jìn)行wait,釋放它們的資源,但是父進(jìn)程一般沒(méi)工夫在那里守著,等著子進(jìn)程的退出,所以,一般使用信號(hào)的方式來(lái)處理,在收到SIGCHLD信號(hào)的時(shí)候,在信號(hào)處理函數(shù)中調(diào)用wait操作來(lái)釋放他們的資源。

五、對(duì)每個(gè)避免僵死進(jìn)程方法的解析與總結(jié)

首先我們讓我們來(lái)看一個(gè)生成僵尸進(jìn)程的程序zombie.c如下:

#include < stdio.h >  
#include < stdlib.h >  
#include < unistd.h >  
  
int main(int argc, const char *argv[])  
{  
    int i;  
    pid_t pid;  
  
    for (i = 0; i < 10; i++) {  
        if ((pid = fork()) == 0)    /* child */  
            _exit(0);  
    }  
    sleep(10);  
  
    exit(EXIT_SUCCESS);  
}

運(yùn)行程序,在10s睡眠期間使用ps查看進(jìn)程,你會(huì)發(fā)現(xiàn)有10個(gè)標(biāo)記為“defunct”的僵尸進(jìn)程:

圖片

接下來(lái)看第一種方法,程序avoid_zombie1.c如下:

#include < stdio.h >  
#include < stdlib.h >  
#include < signal.h >  
#include < unistd.h >  
#include < errno.h >  
  
int main(int argc, const char *argv[])  
{  
    pid_t pid;  
  
    if (SIG_ERR == signal(SIGCHLD, SIG_IGN)) {  
        perror("signal error");  
        _exit(EXIT_FAILURE);  
    }  
  
    while (1) {  
        if ((pid = fork()) == 0)    /* child */  
            _exit(0);  
    }  
  
    exit(EXIT_SUCCESS);  
}

程序運(yùn)行期間通過(guò)ps命令的確沒(méi)有發(fā)現(xiàn)僵尸進(jìn)程的存在。

在man文檔中有這段話(huà):

Note that even though the default disposition of SIGCHLD is "ignore", explicitly setting the disposition to SIG_IGN results in different treatment of zombie process children.

意思是說(shuō)盡管系統(tǒng)對(duì)信號(hào)SIGCHLD的默認(rèn)處理就是“ignore”,但是顯示的設(shè)置成SIG_IGN的處理方式在在這里會(huì)表現(xiàn)不同的處理方式(即子進(jìn)程結(jié)束后,資源由系統(tǒng)自動(dòng)收回,所以不會(huì)產(chǎn)生僵尸進(jìn)程),這是信號(hào)SIGCHLD與其他信號(hào)的不同之處。

在man文檔中同樣有這樣一段話(huà):

The original POSIX standard left the behavior of setting SIGCHLD to SIG_IGN unspecified. 看來(lái)這個(gè)方法不是每個(gè)平臺(tái)都使用,尤其在一些老的系統(tǒng)中,兼容性不是很好,所以如果你在寫(xiě)一個(gè)可移植的程序的話(huà),不推薦使用這個(gè)方法。

第二種方法,即通過(guò)兩次fork來(lái)避免僵尸進(jìn)程,我們來(lái)看一個(gè)例子avoid_zombie2.c:

#include < stdio.h >  
#include < stdlib.h >  
#include < signal.h >  
#include < unistd.h >  
#include < errno.h >  
  
int main(int argc, const char *argv[])  
{  
    pid_t pid;  
  
    while (1) {  
        if ((pid = fork()) == 0) {  /* child */  
            if ((pid = fork()) > 0)  
                _exit(0);  
            sleep(1);  
            printf("grandchild, parent id = %ldn",  
                            (long)getppid());  
            _exit(0);  
        }  
        if (waitpid(-1, NULL, 0) != pid) {  
            perror("waitpid error");  
            _exit(EXIT_FAILURE);  
        }  
    }  
  
    exit(EXIT_SUCCESS);  
}

這的確是個(gè)有效的辦法,但是我想這個(gè)方法不適宜網(wǎng)絡(luò)并發(fā)服務(wù)器中,應(yīng)為fork的效率是不高的。

最后來(lái)看第三種方法, 也是最通用的方法

先看我們的測(cè)試程序avoid_zombie3.c

#include < stdio.h >  
#include < stdlib.h >  
#include < errno.h >  
#include < string.h >  
#include < libgen.h >  
#include < signal.h >  
#include < unistd.h >  
#include < sys/wait.h >  
#include < sys/types.h >  
  
  
void avoid_zombies_handler(int signo)  
{  
    pid_t pid;  
    int exit_status;  
    int saved_errno = errno;  
  
    while ((pid = waitpid(-1, &exit_status, WNOHANG)) > 0) {  
        /* do nothing */  
    }  
  
    errno = saved_errno;  
}  
  
int main(int argc, char *argv[])  
{  
    pid_t pid;  
    int status;  
    struct sigaction child_act;   
  
    memset(&child_act, 0, sizeof(struct sigaction));  
    child_act.sa_handler = avoid_zombies_handler;  
    child_act.sa_flags = SA_RESTART | SA_NOCLDSTOP;   
    sigemptyset(&child_act.sa_mask);  
    if (sigaction(SIGCHLD, &child_act, NULL) == -1) {  
        perror("sigaction error");  
        _exit(EXIT_FAILURE);  
    }  
  
    while (1) {  
        if ((pid = fork()) == 0) {  /* child process */  
            _exit(0);  
        } else if (pid > 0) {        /* parent process */  
        }  
    }  
      
    _exit(EXIT_SUCCESS);  
}

首先需要知道三點(diǎn):

  1. 當(dāng)某個(gè)信號(hào)的信號(hào)處理函數(shù)被調(diào)用時(shí),該信號(hào)會(huì)被操作系統(tǒng)阻塞(默認(rèn)sa_flags不設(shè)置SA_NODEFER標(biāo)志)。

2.當(dāng)某個(gè)信號(hào)的信號(hào)處理函數(shù)被調(diào)用時(shí),該信號(hào)阻塞時(shí),該信號(hào)又多次發(fā)生,那么操作系統(tǒng)并不將它們排隊(duì),而是只保留第一次的,后續(xù)的被拋棄。

還有一點(diǎn)我們必須清楚的是

  1. wait系列函數(shù)與信號(hào)SIGCHLD是沒(méi)有任何關(guān)系的,即wait系列函數(shù)并不是信號(hào)SIGCHLD驅(qū)動(dòng)的。

這個(gè)時(shí)候,肯定有人有疑問(wèn)了,既然會(huì)丟棄信號(hào),那怎么保證可以收回所有的僵尸進(jìn)程呢?

關(guān)于這個(gè)問(wèn)題,我們可以這樣來(lái)理解,當(dāng)子進(jìn)程結(jié)束時(shí),不管有沒(méi)有產(chǎn)生SIGCHLD信號(hào),或者子進(jìn)程產(chǎn)生了SIGCHLD信號(hào),而不管父進(jìn)程有沒(méi)有收到SIGCHLD信號(hào),這都與子進(jìn)程已經(jīng)終止這個(gè)事實(shí)無(wú)關(guān),就是說(shuō),子進(jìn)程終止與信號(hào)其實(shí)沒(méi)有任何關(guān)系,只是操作系統(tǒng)在子進(jìn)程終止時(shí)會(huì)發(fā)送信號(hào)SIGCHLD給父進(jìn)程,告之其子進(jìn)程終止的消息,這樣的話(huà),父進(jìn)程就可以做相應(yīng)的操作了。而wait系列函數(shù)的目的就是收回子進(jìn)程終止時(shí)殘留在進(jìn)程列表中的信息,所以任何時(shí)候調(diào)用while ((pid = waitpid(-1, &exit_status, WNOHANG)) > 0)都可以收回所有的僵尸進(jìn)程信息(可以參考下面的程序)。但是這里為什么放在信號(hào)處理函數(shù)中處理了,這樣做的原因是:子進(jìn)程什么時(shí)候結(jié)束是個(gè)異步事件,而信號(hào)機(jī)制就是用來(lái)處理異步事件的,所以當(dāng)子進(jìn)程結(jié)束時(shí),可以迅速的收回其殘余信息,這樣系統(tǒng)中就不會(huì)積累大量的僵尸進(jìn)程了。

也可以這樣來(lái)理解:系統(tǒng)把所有的僵尸進(jìn)程串在一起形成一個(gè)僵尸進(jìn)程鏈表,而while ((pid = waitpid(-1, &exit_status, WNOHANG)) > 0)就是來(lái)清空這個(gè)鏈表的,直到waitpid()返回0,表明已經(jīng)沒(méi)有僵尸進(jìn)程了,或者返回-1,表明出錯(cuò)(當(dāng)錯(cuò)誤碼errno為ECHILD的時(shí)候同樣表明已經(jīng)不存在僵尸進(jìn)程了)。

了解了以上知識(shí)點(diǎn),就能理解為什么while ((pid = waitpid(-1, &exit_status, WNOHANG)) > 0)能夠回收所有的僵尸進(jìn)程了。

我們可以在上面的信號(hào)處理函數(shù)中加入相應(yīng)的打印信息:

static int num1 = 0  
static int num2 = 0;  
void avoid_zombies_handler(int signo)  
{  
    pid_t pid;  
    int exit_status;  
    int saved_errno = errno;  
  
    printf("num1 = %dn", ++num1);  
    while ((pid = waitpid(-1, &exit_status, WNOHANG)) > 0) {  
        printf("num2 = %dn", ++num2);  
    }  
  
    errno = saved_errno;  
}

打印的結(jié)果你會(huì)發(fā)現(xiàn),當(dāng)num1遞增1的時(shí)候,即每調(diào)用一次信號(hào)處理函數(shù),num2一般會(huì)遞增很多,即while循環(huán)了很多次,所以盡管有的SIGCHLD信號(hào)被丟棄了,但是我們不用擔(dān)心子進(jìn)程的殘余信息會(huì)收不回來(lái)。退出while循環(huán)時(shí),證明此時(shí)系統(tǒng)中已經(jīng)沒(méi)有僵尸進(jìn)程了,所以退出信號(hào)處理函數(shù)后,阻塞的唯一SIGCHLD信號(hào)會(huì)再次觸發(fā)該信號(hào)處理函數(shù),這樣我們就不用擔(dān)心了。我們不防做個(gè)最壞的打算,即之前的信號(hào)全部被丟棄了,只有最后一次的SIGCHLD信號(hào)被捕獲,從而觸發(fā)了信號(hào)處理函數(shù),這樣我們也不用擔(dān)心,因?yàn)閣hile循環(huán)會(huì)一次性收回全部的僵尸進(jìn)程信息,只是這次循環(huán)的次數(shù)要多得多罷了,當(dāng)然這只是假設(shè),一般系統(tǒng)不會(huì)出現(xiàn)這樣的情況(可以參考本文最后一個(gè)程序事例)。

為了證明wait系統(tǒng)函數(shù)與信號(hào)SIGCHLD沒(méi)有任何關(guān)系,我們可以做個(gè)簡(jiǎn)單的實(shí)驗(yàn),代碼如下:

#include < stdio.h >  
#include < stdlib.h >  
#include < unistd.h >  
#include < sys/wait.h >  
#include < sys/types.h >  
  
int main(int argc, char *argv[])  
{  
    int i;  
    pid_t pid;  
  
    for (i = 0; i < 5; i++) {  
        if ((pid = fork()) == 0)    /* child */  
            _exit(0);  
    }  
    sleep(10);  
    while (waitpid(-1, NULL, WNOHANG) > 0) {  
        /* do nothing */  
    }  
    sleep(10);  
  
    _exit(EXIT_SUCCESS);  
}

以下是打印結(jié)果:

圖片

可以看到第一次sleep時(shí)系統(tǒng)中積累了5個(gè)僵尸進(jìn)程,第二次sleep時(shí),那5個(gè)僵尸進(jìn)程都被收回了。這個(gè)也明顯的看到了使用信號(hào)處理函數(shù)的優(yōu)勢(shì),即可以保證系統(tǒng)不會(huì)積累大量的僵尸進(jìn)程,它可以迅速的清理掉系統(tǒng)中的僵尸進(jìn)程。

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

    關(guān)注

    87

    文章

    11511

    瀏覽量

    213857
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3125

    瀏覽量

    75279
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3826

    瀏覽量

    83006
  • WAIT
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    2612
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux開(kāi)發(fā)_Linux進(jìn)程編程

    介紹Linux進(jìn)程概念、進(jìn)程信號(hào)捕獲、進(jìn)程管理相關(guān)的命令的使用等知識(shí)點(diǎn)。
    的頭像 發(fā)表于 09-17 15:38 ?1684次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>開(kāi)發(fā)</b>_<b class='flag-5'>Linux</b><b class='flag-5'>下</b><b class='flag-5'>進(jìn)程</b>編程

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

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

    Linux進(jìn)程間如何實(shí)現(xiàn)共享內(nèi)存通信

    這次我們來(lái)講一Linux進(jìn)程通信中重要的通信方式:共享內(nèi)存作為Linux軟件開(kāi)發(fā)攻城獅,進(jìn)程
    發(fā)表于 04-26 17:14 ?822次閱讀

    linux查詢(xún)進(jìn)程占用的內(nèi)存方法有哪些?

    linux查詢(xún)進(jìn)程占用的內(nèi)存方法
    發(fā)表于 04-08 06:03

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

    前段時(shí)間,由于研究經(jīng)典面試題,把孤兒進(jìn)程僵尸進(jìn)程也總結(jié)了一。我們有這樣一個(gè)問(wèn)題:孤兒進(jìn)程僵尸
    發(fā)表于 11-29 14:08

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

    (TASK_KILLABLE):Linux內(nèi)核 2.6.25 引入了一種新的進(jìn)程狀態(tài),名為 TASK_KILLABLE。該狀態(tài)的運(yùn)行機(jī)制類(lèi)似于 TASK_UNINTERRUPTIBLE,只不過(guò)處在該狀態(tài)
    發(fā)表于 05-27 09:24

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

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

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

    ?線(xiàn)程間同步方法有哪些?什么是內(nèi)核線(xiàn)程和用戶(hù)線(xiàn)程??jī)?nèi)核線(xiàn)程和用戶(hù)線(xiàn)程的區(qū)別??jī)?nèi)核線(xiàn)程和用戶(hù)線(xiàn)程有什么優(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)該遇到這個(gè)術(shù)語(yǔ)“僵尸進(jìn)程Zombie Processes”。 那么什么是僵尸進(jìn)程? 它們是怎么產(chǎn)生的? 它們
    的頭像 發(fā)表于 12-18 15:56 ?6048次閱讀
    <b class='flag-5'>僵尸</b><b class='flag-5'>進(jìn)程</b>的產(chǎn)生介紹和危害以及解決<b class='flag-5'>方法</b>

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

    首先要明確一點(diǎn),僵尸進(jìn)程的含義是:子進(jìn)程已經(jīng)死了,但是父進(jìn)程還沒(méi)有wait它的一個(gè)中間狀態(tài),這個(gè)時(shí)候子進(jìn)程是一個(gè)
    的頭像 發(fā)表于 07-28 10:09 ?4908次閱讀
    什么是<b class='flag-5'>僵尸</b><b class='flag-5'>進(jìn)程</b>_<b class='flag-5'>Linux</b><b class='flag-5'>僵尸</b><b class='flag-5'>進(jìn)程</b>可以被“殺死”嗎?

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

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

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

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

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

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

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

    在了解Zombie進(jìn)程之前,讓我回憶一什么是進(jìn)程。簡(jiǎn)而言之,進(jìn)程是程序?qū)嵗?。它可以是前臺(tái)的交互式進(jìn)程或后臺(tái)的非交互式或自動(dòng)
    的頭像 發(fā)表于 12-12 17:40 ?2317次閱讀

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

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