Linux程序關係最新解讀2016
Linux的程序相互之間有一定的關係。比如說,在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, &, %