殭屍進程

殭屍進程: 子進程退出,父進程沒有回收子進程資源(PCB),則子進程變成殭屍進程
孤兒進程: 父進程先於子進程結束,則子進程成爲孤兒進程,子進程的父進程成爲1號
進程init進程,稱爲init進程領養孤兒進程

一個進程在終止時會關閉所有文件描述符,釋放在用戶空間分配的內存,但它的PCB還
保留着,內核在其中保存了一些信息:如果是正常終止則保存着退出狀態,如果是異常終止
則保存着導致該進程終止的信號是哪個。這個進程的父進程可以調用wait或waitpid獲取這
些信息,然後徹底清除掉這個進程。我們知道一個進程的退出狀態可以在Shell中用特殊變
量$?查看,因爲Shell是它的父進程,當它終止時Shell調用wait或waitpid得到它的退出狀
態同時徹底清除掉這個進程。
如果一個進程已經終止,但是它的父進程尚未調用wait或waitpid對它進行清理,這時
的進程狀態稱爲殭屍(Zombie)進程。任何進程在剛終止時都是殭屍進程,正常情況下,僵
屍進程都立刻被父進程清理了,爲了觀察到殭屍進程,我們自己寫一個不正常的程序,父進
程fork出子進程,子進程終止,而父進程既不終止也不調用wait清理子進程:

 

 

#include <unistd.h>
#include <stdlib.h>

int main()
{
    pid_t pid = fork();
    if (pid < 0)
    {
        perror("fork");
        exit(0);
    }

    /* parent */
    if (pid > 0)
    {
        while(1);///父進程在做死循環
    }

   ///子進程直接退出,就產生了殭屍進程

/// 通過ps -aux 命令可以在後頭看到可執行程序的進程信息有 <defunct>這個字段

    /* child */

    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章