殭屍進程和孤兒進程

在linux系統中,每個被運行的程序實例對應一個或多個進程。linux內核需要對這些進程進行管理,以使它們在系統中“同時”運行。爲了弄明白正在運行的進程是什麼意思,我們需要了解幾種運行狀態:
R (TASK_RUNNING),可執行狀態。
只有在該狀態的進程纔可能在CPU上運行。而同一時刻可能有多個進程處於可執行狀態,這些進程的task_struct結構(進程控制塊)被放入對應 CPU的可執行隊列中(一個進程最多隻能出現在一個CPU的可執行隊列中)。進程調度器的任務就是從各個CPU的可執行隊列中分別選擇一個進程在該CPU 上運行。
S (TASK_INTERRUPTIBLE),可中斷的睡眠狀態。
處於這個狀態的進程因爲等待某某事件的發生(比如等待socket連接、等待信號量),而被掛起。這些進程的task_struct結構被放入對應事件的等待隊列中。當這些事件發生時(由外部中斷觸發、或由其他進程觸發),對應的等待隊列中的一個或多個進程將被喚醒。
D (TASK_UNINTERRUPTIBLE),不可中斷的睡眠狀態。
與TASK_INTERRUPTIBLE狀態類似,進程處於睡眠狀態,但是此刻進程是不可中斷的。不可中斷,指的並不是CPU不響應外部硬件的中斷,而是指進程不響應異步信號。
T (TASK_STOPPED or TASK_TRACED),暫停狀態或跟蹤狀態。
向進程發送一個SIGSTOP信號,它就會因響應該信號而進入TASK_STOPPED狀態(除非該進程本身處於 TASK_UNINTERRUPTIBLE狀態而不響應信號)。(SIGSTOP與SIGKILL信號一樣,是非常強制的。不允許用戶進程通過 signal系列的系統調用重新設置對應的信號處理函數。)
Z (TASK_DEAD - EXIT_ZOMBIE),退出狀態,進程成爲殭屍進程。
進程在退出的過程中,處於TASK_DEAD狀態。 在這個退出過程中,進程佔有的所有資源將被回收,除了task_struct結構(以及少數資源)以外。於是進程就只剩下task_struct這麼個空殼,故稱爲殭屍。
X (TASK_DEAD - EXIT_DEAD),退出狀態,進程即將被銷燬。
這裏寫圖片描述 運行狀態(running)並不意味着進程一定在運行中,它表明進程要麼是在運行中要麼在運行隊列⾥裏。睡眠狀態(sleeping)意味着進程在等待事件完成(這裏的睡眠有時候也叫做可中斷睡眠(interruptible sleep))。磁盤休眠狀態(Disk sleep)有時候也叫不可中斷睡眠狀態(uninterruptible sleep),在這個狀態的進程通常會等待IO的結束。

殭屍進程:一個子進程在其父進程沒有調用wait()或waitpid()的情況下退出。這個子進程就是殭屍進程。如果其父進程還存在而一直不調用wait,則該殭屍進程將無法回收,等到其父進程退出後該進程將被init回收。

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

int main()
{
    pid_t pid;
    pid = fork();
    if (pid == 0)
    {
        printf("i am child process\n");
        exit(0);
    }
    printf("I am father process.I will sleep\n");
    //等待子進程先退出
    sleep(2);
    //輸出進程信息
    system("ps -o pid,ppid,state,tty,command");
    printf("father!\n");
    return 0;
}
發佈了49 篇原創文章 · 獲贊 28 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章