Linux程式關係

ii_chengzi發表於2020-02-18


Linux的程式相互之間有一定的關係。比如說,在 中,我們看到,每個程式都有父程式,而所有的程式以init程式為根,形成一個樹狀結構。我們在這裡講解程式組和會話,以便以更加豐富的方式了管理程式。

 
程式組 (process group)

每個程式都會屬於一個程式組(process group),每個程式組中可以包含多個程式。程式組會有一個程式組領導程式 (process group leader),領導程式的PID (PID見Linux程式基礎)成為程式組的ID (process group ID, PGID),以識別程式組。

$ps -o pid,pgid,ppid,comm | cat

  PID  PGID  PPID COMMAND
17763 17763 17751 bash
18534 18534 17763 ps
18535 18534 17763 cat


PID為程式自身的ID,PGID為程式所在的程式組的ID, PPID為程式的父程式ID。從上面的結果,我們可以推測出如下關係:

圖中箭頭表示父程式透過fork和exec機制產生子程式。ps和cat都是bash的子程式。程式組的領導程式的PID成為程式組ID。領導程式可以先終結。此時程式組依然存在,並持有相同的PGID,直到程式組中最後一個程式終結。

 

我們將一些程式歸為程式組的一個重要原因是我們可以將訊號傳送給一個程式組。程式組中的所有程式都會收到該訊號。我們會在下一部分深入討論這一點。

 
會話 (session)

更進一步,在shell支援工作控制(job control)的前提下,多個程式組還可以構成一個會話 (session)。bash(Bourne-Again shell)支援工作控制,而sh(Bourne shell)並不支援。

會話是由其中的程式建立的,該程式叫做會話的領導程式(session leader)。會話領導程式的PID成為識別會話的SID(session ID)。會話中的每個程式組稱為一個工作(job)。會話可以有一個程式組成為會話的前臺工作(foreground),而其他的程式組是後臺工作(background)。每個會話可以連線一個控制終端(control terminal)。當控制終端有輸入輸出時,都傳遞給該會話的前臺程式組。由終端產生的訊號,比如CTRL+Z, CTRL+\,會傳遞到前臺程式組。

會話的意義在於將多個工作囊括在一個終端,並取其中的一個工作作為前臺,來直接接收該終端的輸入輸出以及終端訊號。 其他工作在後臺執行。

 

一個命令可以透過在末尾加上&方式讓它在後臺執行:

$ping localhost > log &

此時終端顯示:

[1] 10141

括號中的1表示工作號,而10141為PGID

我們透過如下方式查詢更加詳細的資訊:

$ps -o pid,pgid,ppid,sid,tty,comm

(tty表示控制終端)

 

訊號可以透過kill

$kill -SIGTERM -10141

或者

$kill -SIGTERM %1

的方式來傳送給工作組。上面的兩個命令,一個是傳送給PGID(透過在PGID前面加-來表示是一個PGID而不是PID),一個是傳送給工作1(%1),兩者等價。

 

一個工作可以透過$fg從後臺工作變為前臺工作:

$cat > log &

$fg %1

當我們執行第一個命令後,由於工作在後臺,我們無法對命令進行輸入,直到我們將工作帶入前臺,才能向cat命令輸入。在輸入完成後,按下CTRL+D來通知shell輸入結束。

 

程式組(工作)的概念較為簡單易懂。而會話主要是針對一個終端建立的。當我們開啟多個終端視窗時,實際上就建立了多個終端會話。每個會話都會有自己的前臺工作和後臺工作。這樣,我們就為程式增加了管理和執行的層次。在沒有圖形化介面的時代,會話允許使用者透過shell進行多層次的程式發起和管理。比如說,我可以透過shell發起多個後臺工作,而此時標準輸入輸出並不被佔據,我依然可以繼續其它的工作。如今,圖形化介面可以幫助我們解決這一需求,但工作組和會話機制依然在Linux的許多地方應用。

 
總結

process group, pgid

session, sid, job, forground, background

fg, kill -pid, &, %

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31543790/viewspace-2676074/,如需轉載,請註明出處,否則將追究法律責任。

相關文章