進程組、作業、會話之間的關係

  • 進程組:
  • 概念:進程組是一個或多個進程的集合

  • 每個進程除了有一個進程ID之外,還屬於一個進程組。通常與同一個作業相關聯,可以接收到來自同一個終端的信號。

  • 每個進程組有一個唯一標識的進程組ID。

  • 每個進程組都可以有一個組長進程,組長進程的ID等於進程ID

  • 組長進程可以創建一個進程組,創建該組的進程,然後終止,只要該進程組中有一個進程存在,無論組長進程是否終止,該進程組都是存在的
    就好比一個班級的班長如果不在,那這個班級還是存在的

  • 下面就舉一個例子:
    這裏寫圖片描述

殺掉組長進程後,該進程組還在:

這裏寫圖片描述
在命令行輸入”&”表示將該進程放在後臺運行
ps選項:
a:不僅列出當前用戶的進程,也列出所有其他用戶的進程
x:不僅列出有控制終端的進程,也列出所有無控制終端的進程
j:列出與作業控制相關的信息
Ctrl +z/c/ 終止一個進程組

  • 作業:

  • Shell分前後臺來控制的不是進程而是作業或者進程組。一個作業可以由多個進程組成。

  • Shell可以運行一個前臺作業和任意多個後臺作業,稱爲作業控制
    bash是一個獨立的作業,獨立的進程組
    作業與進程組的區別:如果作業中的某個進程又創建了子進程,則子進程不屬於作業,但屬於進程組

一旦作業運行結束,Shell就把自己提到前臺(子進程還在,但子進程不屬於作業),如果原來的前臺進程還存在(如果這個子進程還沒終止),它自動變爲後臺進程組
下面舉一個例子:

#include <stdio.h>
#include<unistd.h>
int main()
{
    pid_t id = fork();
    if(id < 0)
    {
        perror("fork");
        return 1;
    }
    else if(id == 0)
    {
        //child
        while(1)
        {
            printf("child %d is running...\n",getpid());
            sleep(1);
        }
    }
    else
    {
        //father
        int i = 10;
        while(i)
        {
            printf("parent %d is going to dead... i = %d\n",getpid(),i--);
            sleep(1);
        }
    }
    return 0;
}

運行結果如下:

這裏寫圖片描述

當程序運行起來,在前臺新起了一個作業,包含父子兩個進程
10秒之內shell無法執行任何命令,說明此時的前臺作業不是shell

這裏寫圖片描述

當10秒後父進程退出,子進程還在繼續運行,但此時輸入命令,shell就可以執行了,說明此時的shell變成了前臺作業

  • 作業控制:
    這裏寫圖片描述

這裏寫圖片描述

  • 會話:
  • 概念:會話是一個或多個進程組的集合。

  • 一個會話可以有一個控制終端,一個會話中的幾個進程組可被分爲一個前臺進程組或多個後臺進程組。所以一個會話中,應該包括控制進程(會話首進程),一個前臺進程組和任意後臺進程組
    默認前臺進程組:bash
    默認會話首進程:bash
    這裏寫圖片描述
    SID爲會話ID,三個進程屬於同一個進程組,同一個會話

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