Linux進程關係(轉載)

Linux的進程相互之間有必定的關係。好比說,在Linux進程基礎中,咱們看到,每一個進程都有父進程,而全部的進程以init進程爲根,造成一個樹狀結構。咱們在這裏講解進程組和會話,以便以更加豐富的方式了管理進程。html

 

進程組 (process group)

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

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

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


PID爲進程自身的ID,PGID爲進程所在的進程組的ID, PPID爲進程的父進程ID。從上面的結果,咱們能夠推測出以下關係:session

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

 

咱們將一些進程歸爲進程組的一個重要緣由是咱們能夠將信號發送給一個進程組。進程組中的全部進程都會收到該信號。咱們會在下一部分深刻討論這一點。code

 

會話 (session)

更進一步,在shell支持工做控制(job control)的前提下,多個進程組還能夠構成一個會話 (session)。bash(Bourne-Again shell)支持工做控制,而sh(Bourne shell)並不支持。htm

會話是由其中的進程創建的,該進程叫作會話的領導進程(session leader)。會話領導進程的PID成爲識別會話的SID(session ID)。會話中的每一個進程組稱爲一個工做(job)。會話能夠有一個進程組成爲會話的前臺工做(foreground),而其餘的進程組是後臺工做(background)。每一個會話能夠鏈接一個控制終端(control terminal)。當控制終端有輸入輸出時,都傳遞給該會話的前臺進程組。由終端產生的信號,好比CTRL+Z, CTRL+\,會傳遞到前臺進程組。blog

會話的意義在於將多個工做囊括在一個終端,並取其中的一個工做做爲前臺,來直接接收該終端的輸入輸出以及終端信號。 其餘工做在後臺運行。進程

 

一個命令能夠經過在末尾加上&方式讓它在後臺運行:terminal

$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, &, %

相關文章
相關標籤/搜索