Linux 程序間關係 終端 作業控制

2021-08-18 21:57:47 字數 3673 閱讀 5807

一、程序間關係(3種)

1.程序組

每個程序除了有乙個程序id之外,還屬於乙個程序組。程序組是乙個或多個程序的集合。通常,它們與同一作業相關聯,可以接收來自同一終端的各種訊號。每個程序組都有乙個唯一的程序組id。每個程序組都可以有乙個組長程序。組長程序標識的是,其程序組id等於其程序id(一般,預設每一組的第乙個程序為組長程序)。組長程序可以建立乙個程序組,建立該組中的程序,然後終止。

注意:只要在某個程序組中乙個程序存在,則該程序組就存在,這與其組長程序是否終止無關。

例項如下:

通過上圖,有以下幾點說明:

(1)『&』:表示將程序組放在後台執行

(2)這裡的程序有:2570、2571、2572

(3)程序組組長:2570(預設情況下為程序組當中的第乙個程序)

(4)ps的選項:

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

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

(5)kill  -9:可以殺掉組長程序,但是該程序組還在(我們來驗證一下這個結論,如下圖)

2.作業

(1)shell分前後台來控制的不是程序而是作業(job)或者程序組(process group)。

(2)作業控制:乙個前台作業可以由多個程序組成,乙個後台也可以由多個程序組成,shell可以執行乙個前台作業和任意多個後台作業。

(3)作業與程序組的區別:如果作業中的某個程序又建立了子程序,則該子程序不屬於作業,但屬於該程序組。

(4)一旦作業執行結束,shell就會把自己提到前台(雖然子程序還在,但是該子程序不屬於作業)。如果原來的前台程序還存在(該子程序還沒有終止),它會自動變為後台程序。

(5)檢視後台作業:jobs

將前台作業提至後台:bg 2(2為作業號)先要ctrl c終止後台作業

將後台作業提至前台:fg 2

如果我們在前台新起乙個作業,則shell是無法在前台執行的(shell只可以執行乙個前台作業),此時,它被提到了後台。當前臺程序退出時,shell就又被提到了前台,可以繼續接受使用者的輸入。

下面,我們來看兩個例子。

例一:

我們來看一下執行結果:

由此,我們可以驗證上面我們所說的結論。

fork出乙個子程序後,父程序先退出,作業結束,該程序組還在,shell成為前台作業,子程序跑去後台,成為後台程序組,ctrl c終止不了。

那該怎麼終止該程序呢?

使用ps,檢視該程序的pid,使用kill -9 (程序id號)殺掉該程序。

注意:由於子程序在後台每一秒執行一次,我們在敲命令的時候手速太慢,可能會出現亂碼的情況(這只是在我們看來是亂碼的),作業系統不會這麼認為,別慌,將命令敲進去就好了!

例二:

執行結果:

說明:如果作業中的某個程序又建立了子程序,則該子程序不屬於作業但屬於該程序組,如果父子程序同時在前台執行,ctrl c可以終止父子程序。這裡需要注意的是,ctrl c是在向前臺程序組傳送訊號,而不是向作業傳送訊號。

3.會話

會話(session)是乙個或多個程序組的集合。乙個會話可以有乙個控制終端。這通常是登入到其上的終端裝置(在終端登入情況下)或偽終端裝置(在網路登陸情況下)。建立與控制終端連線的會話首程序被稱為控制程序。乙個會話中的幾個程序組可被分為乙個前台程序組以及乙個或多個後台程序組。所以乙個會話中,應該包括控制程序(會話首程序),乙個前台該程序組和任意後台程序組。

新開啟乙個終端:

其中,sid:會話id(這裡的會話id是3244),四個程序都屬於同乙個程序組(3405),同乙個會話(3244)

但是,這些程序的父程序也就是ppid(3244)是誰呢?我們在這裡並沒有建立程序啊!我們來看看

現在,我們就知道了,這裡的3244是bash!也就是我們的直譯器,會話首程序,而且這幾個程序的父程序都是bash

(細心的讀者可能會發現,這裡的怎麼是-bash啊,出現-bash的原因是在網路中登入)

二、終端

終端:

三、作業控制

(1)session與程序組「shell可以同時執行乙個前台程序和任意多個後台程序」其實是不全面的,現在我們來研究更複雜的情況。事實上,shell分前後台來控制的不是程序而是作業(job)或者是程序組(process group)。

(2)作業控制(job control):乙個前台作業可以由多個程序組成,乙個後台作業也可以由多個程序組成,shell可以同時執行乙個前台作業和任意多個後台作業。

(前面也說了這個概念,這裡我們再一次加深印象)

注意:這裡我們來看『&』觀察該程序在前台還是後台

通過上圖的我們不難發現:

ctrl c殺掉的不是程序,而是作業!

(3)作業有關的控制訊號

通過下圖我們來理解與作業控制有關的訊號

將cat放到後台執行,由於cat需要讀標準輸入(也就是終端輸入),而後台程序是不能讀終端輸入的,因此核心發sigttin訊號給程序,該程序的預設處理動作是使程序停止。

(1)jobs命令可以檢視當前有哪些作業。

(2)fg命令可以將某個作業提至前台執行,如果該作業的程序組正在後台執行,則提至前台執行,如果該作業處於停止狀態,則給程序組的每個程序發sigcont訊號使它繼續執行。

(3)cat提到前台後,掛起等待終端輸入,當輸入heihei並回車後,cat列印出來同樣的一行,然後繼續掛起等待輸入。如果輸入ctl z,則向所有前台程序發sigtstp訊號,該訊號的預設處理動作是使程序停止,cat繼續以後作業的形式存在。

(4)bg命令可以讓某個停止的作業在後台繼續執行,也需要給該作業的程序組的每個程序發sigcont訊號。cat程序繼續執行,又要讀終端輸入,然而它在後台不能讀終端輸入,所以又要收到sigttin訊號而停止。

用kill命令給乙個停止的程序發sigterm(15)訊號,這個訊號並不會立刻處理,而要等程序準備繼續執行之前處理,預設動作是終止程序。但如果給乙個停止的程序發sigkill訊號就不同了。

因此,可以得出結論,後台程序不能從終端下讀取資料。

其實,後台程序也不能在終端寫資料(因為後台程式,stdin/stdout/stderr三個輸入輸出的管道都被遮蔽了)。

Linux程序間關係

程序組 每乙個程序除了自己的程序id,還有自己的程序組id。程序組由乙個或多個程序組成。通常它們與作業相關聯,可以接受同一終端的各種訊號。在程序組中程序id與程序組id相同的為程序組長 組長程序可以建立乙個程序組,建立該組中的程序,然後終止。只要在某個程序組中乙個程序存在,則該程序組就存在,這與其組...

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

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

Linux 程序間關係 守護程序

ps axj head n 1乙個或多個程序的集合 只要在某個程序組中 個程序存在,則該程序組就存在,這與其組 程序是否終 關。個前台作業可以由多個程序組成 乙個後台也可以由多個程序組成 作業與程序組的區別 a.out sid 會話 session 是 個或多個程序組的集合。建 與控制終端連線的會話...