進程間關係

1、進程組
進程組是一個或多進程的集合。通常,它們同一作業相關聯,可以接收來自同一終端的各種信號。每個進程組有一個唯一的進程組id。每個進程都可以有一個組長進程。組長進程的標識是,其進程組id等於其進程id。組長進程可以創建一個進程組,創建該組中的進程,然後終止。只要在某個進程組中一個進程存在,則該進程組就存在,這與其組長進程是否終止無關。
這裏寫圖片描述

‘&’ :表示將進程組放在後臺執行。
進程: 2931 2932 2933
組長: 2931 ,進程組中的第一個進程
如上圖,使用命令 kill -9 2931 殺掉組長進程,進程組還在。

查看進程指令 ps:
(1)a:不僅列當前用戶的進程,也列出所有其他用戶的進程。
(2)x:不僅列有控制終端的進程,也列出所有無控制終端得進程。
(3)j:列出與作業控制相關的信息。

2、作業

(1) Shell分前後臺來控制的不是進程而是作業或者進程組。一個前臺作業可以由多個進程組成,一個後臺也可以由多個進程組成,Shell可以運行一個前臺作業和多個後臺作業。

(2)作業與進程組的區別: 如果作業中的某個進程創建了子進程,那麼子進程屬於當前進程組,但不屬於當前作業。

(3)一但作業運行結束,Shell就把自己提到前臺(子進程還在,但不屬於作業),如果原來的前臺進程還存在(子進程還在),子進程自動變爲後臺進程組。
(4)後臺作業可以向前臺輸出信息,但後臺作業不能從前臺讀取信息。
模擬實現該場景:

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

int main()
{
    pid_t pid=fork();
    if(pid<0)
    {
        perror("fork");
        return 1;
    }
    else if(pid==0)
    { //child
        while(1)
        {
            printf("child(%d)# I am running!\n",getpid());
            sleep(1);
        }
    }
    else
    { //parent
        printf("father(%d) is exit!\n",getpid());
        sleep(1);
    }
    return 0;
}

3、作業控制:
Shell 分前後臺來控制的不是進程而是作業或者進程組。一個前臺作業可以由多個進程組成,一個後臺作業也可以由多個進程組成,Shell可以同時運行一個前臺作業和任意多個後臺作業。

(1)作業控制常用的指令:
a. 查看後臺作業: jobs
b. 將前臺作業轉到後臺狀態爲stopped : ctrl+z
c. 將後臺作業轉爲前臺: fg [作業編號]
d. 將作業放到後臺狀態爲running : bg [作業編號]
(2)
這裏寫圖片描述
注: cat 查看指令比較特殊,將cat 轉爲後臺其狀態只能是stopped,因爲cat 是在前臺讀取信息,而後臺作業只能向前臺輸出信息,不能從前臺讀取信息,所以cat 轉後臺狀態只能是stopped。因爲是stopped狀態所以只能使用 kill -9 將其殺死。
這裏寫圖片描述

4、會話
會話是一個或多個進程的集合。一個會話可以有一個控制終端。這通常是登陸到其上的終端設備(在終端登陸情況下)或僞終端設備(在網絡登陸情況下)。建立與控制終端連接的會話首進程被稱爲控制進程。一個會話中的幾個進程組可被分爲一個前臺進程組以及一個或多個後臺進程組。所以一個會話中,應包括控制進程(會話首進程),一個前臺進程組和任意後臺進程組。

注:有 -bash 表示從網絡重登錄的; SID是會話ID。
這裏寫圖片描述

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