程序間關係 程序組 作業 會話

2021-08-19 04:18:05 字數 3100 閱讀 3332

程序組

之前我們在檢視系統程序相關資訊時,會看到每乙個程序的id和其父程序的id等相關資訊,其中就有乙個pgid,代表的是組id。什麼是組id呢?程序除了有自己的乙個程序id之外,每乙個程序還屬於乙個程序組。而這其中的pgid就是組id,指明了該程序是屬於哪乙個程序組。

那麼什麼是程序組呢?其實這個程序組就是乙個或多個程序的集合。通常情況下,他們與同乙個作業相關聯,可以接收來自同一終端的各種訊號。每個程序組有乙個唯一的程序組id,每個程序組都可以有乙個組長程序。組長程序的標識是,其程序組id等於其程序id。組長程序可以建立乙個程序組,建立該組中的程序,然後終止。需要注意的一點就是:只要在某個程序組中乙個程序存在,該程序組就存在,這與其組長程序是否終止無關。

&:將程序組放到後台執行

ps選項:

a:不僅列當前使用者的程序,也列出所有的其他使用者的程序

x:表示不僅列有控制終端的程序,也列出所有的無控制終端的程序

j:表示列出與作業控制相關的資訊

從圖找那個我們可以看到,程序55755和程序55756同屬於乙個程序組55755,該程序組中的組長程序是55755程序。下面我們可以用kill命令殺死組長程序55755,但是55756程序依舊存在,所以該程序組55755是依舊存在的。

作業

shell分前後台來控制的不是程序而是作業(job)或者程序組(process group)。乙個前台作業可以由 多個程序組成,乙個後台也可以由多個程序組成,shell可以執行乙個前台作業和任意多個後台作業,這稱為作業控制

為什麼只能執行乙個前台作業?答:當我們在前台新起了乙個作業,shell就被提到了後台,因此shell就沒有辦法再繼續接受我們的指令並且解析執行了。

但是如果前台程序退出了,shell就會有被提到前台來,就可以繼續接受我們的命令並且解析執行。

作業與程序組的區別:如果作業中的某個程序有建立了子程序,則該子程序是不屬於該作業的。一旦作業執行結束,shell就把自己提到前台(子程序還存在,但是子程序不屬於作業),如果原來的前台程序還存在(如果這個子程序還沒有終止),他將自動變為後台程序組。

舉例說明:

#include 

#include

int main()

else

if(id == 0)

}else

}return

0;}

執行結果如下圖:

從上圖我們可以看到,當程式執行以後,5s以內,shell無法接受我們的命令去解析執行,說明此時的前台作業不是shell。當5s過去以後,父程序會退出,這時我們就發現shell可以接受我們的命令取解析執行它,這就說明父程序退出以後,shell有被提到前台來,變成了前台作業。

我們新起的作業結束了,但子程序還在,就自動被提到了後台執行,可以看到還一直在打訊息(殺掉即可)。子程序叔叔的父程序也還存在。組長程序是父程序但是已經退出了。

會話

會話(session)是乙個或多個程序組的集合。乙個會話可以有乙個控制終端。建立與控制中短的鏈結的會話收程序被稱為控制程序,乙個會話中的幾個程序組可被分為乙個前台程序組以及乙個或多個後台程序組。所以乙個會話中,應該包括控制程序(會話首程序),乙個前台程序組(通常為bash)和任意後台程序組。

我們可以看到,sleep 2000(58747)和sleep 3000(58748)兩個程序屬於同乙個程序組(58747),也屬於同乙個會話(55460 sid就是會話id)。我們可以看一看55460到底指得是誰。

有上圖可以看到,55460就是bash。而且兩個程序的父程序都是bash。

當我們多開啟了幾個終端之後就會發現,每開啟乙個就新建了乙個會話。

如上圖所示,前3個藍色框中得是在終端1起的作業,紅色框中的實在終端2 新起的作業,綠色框中是在終端3新起的作業。

作業控制

session與程序組」shell可以執行乙個前台程序和任意多個後台程序」其實是不全面的。在上面就已經說到shell分前後臺控制的不是程序而是作業或者程序組,乙個前台作業可以由多個程序組成,乙個後台作業也可以由多個程序 組成,shell可以同時執行乙個前台作業和任意多個後台作業。這稱為作業控制。

現在需要明確一點就是,ctrl+c殺掉的是整個作業,而不是殺掉某乙個程序。

(1) jobs:檢視當前有哪些作業

(2)fg:將某個作業提至前台執行,如果該作業的程序組在後台執行,則提至前台執行,如果該作業處於停止狀態,則給程序組的每乙個程序傳送乙個sigcont訊號是他繼續執行,引數1表示第乙個訊號

(3)ctrl+z:向所有前台程序發sigtstp訊號,該訊號的預設處理動作是使程序停止,以後台作業的形式存在。

(4)bg:讓某個停止的作業在後台繼續執行,也需要給該作業的程序組的每乙個程序 傳送sigcont訊號。

程序組 作業 會話之間的關係

殺掉組長程序後,該程序組還在 在命令列輸入 表示將該程序放在後台執行 ps選項 a 不僅列出當前使用者的程序,也列出所有其他使用者的程序 x 不僅列出有控制終端的程序,也列出所有無控制終端的程序 j 列出與作業控制相關的資訊 ctrl z c 終止乙個程序組 一旦作業執行結束,shell就把自己提到...

程序組 作業及會話

1.程序組 每個程序組有 乙個唯一的程序組id,就跟程序有自己唯一的乙個程序id一樣。每個程序除了有自己的程序id外,還會屬於乙個程序組,乙個或多個程序的集合稱為乙個程序組。它們與同一作業作業相關聯。只要程序組中有乙個程序存在,那麼這個程序組就是存在的 之前說過乙個程序也能稱為乙個程序組 2.作業 ...

Linux 程序組 作業 會話

我們在利用指令檢視程序資訊的表頭 其中ppid與pid是父程序id與子程序id,而這裡有個pgid是什麼呢?我們在談論執行緒的時候,說過執行緒有乙個執行緒組,而執行緒組id就是這個執行緒主線程的id。也是這個執行緒所組成程序的程序pid。而程序也是有程序組的,這裡的這個pgid就是程序組id,每個程...