Linux--進程組 作業 會話 守護(精靈)進程

1.    進程組

每個進程除了有一個進程ID之外,還屬於一個進程組。進程組是一個或多個進程的集合。通常它們與同一作業相關聯,可以接受來自同一終端的各種信號。每個進程組都有唯一的進程組ID。函數getpgrp可以得到進程的進程組ID。(getpgrp()如 圖1.0 & 圖1.1所示)

圖1.0

wKiom1edy5byDj3tAAB_5euUhFc938.png

圖1.1wKioL1edy7ixx1QxAAA4MpUKNwc557.png

每個進程組都可以有一個組長進程。組長進程的標識是,其進程組ID等於進程ID。組長進程可以創建一個進程組,創建該組中的進程,然後終止。只要在 某個進程組中有一個進程存在,則該進程組就存在,與其組成進程是否終止無關。進程組的最後一個進程可以終止,或者轉移到另一個進程組。

進程可以調用setpgid來加入一個現有的組或者一個新進程組。(setpgid()如 圖1.0 & 圖1.1所示)


2.     作業

Shell分前後臺來控制的不是進程而是作業(Job)或者進程組(Process Group)。一個前臺作業可以由多個進程組成,一個後臺也可以由多個進程組成,Shell可以運行一個前臺作業和任意多個後臺作業,這稱爲作業控制。

作業與進程組的區別:如果作業中的某個進程又創建了子進程,則子進程不屬於作業。一旦作業運行結束,Shell就把自己提到前臺,如果原來的前臺進程還存在(如果這個子進程還沒終止),它自動變爲後臺進程組。


3.    會話

會話(session)是一個或多個進程組的集合。進程調用setsid函數建立新會話。

wKioL1ed-kqhoFQ3AAAlzGGHTeY062.png

wKioL1ed-tLRbWLoAAAjhftVjvk111.png

一個會話可以有一個控制終端。這通常是登陸到其上的終端設備(在終端登陸情況下)或僞終端 設備(在網絡登陸情況下)。建立與控制終端連接的會話首進程被稱爲控制進程。一個會話中的幾個進程組可被分爲一個前臺進程組以及一個或多個後臺進程組。所 以一個會話中,應該包括控制進程(會話首進程),一個前臺進程組和任意後臺進程組。

  1. $ proc1 | proc2 &

  2. $ proc3 | proc4 | proc5

其中proc1與proc2屬於同一個後臺進程組,proc3,proc4和proc5屬 於同一個前臺進程組,Shell本身屬於一個單獨的進程組。這些進程組的控制終端相同,它們同屬於一個會話,當用戶在控制終端輸入特殊的控制鍵(如 Ctrl+C,產生SIGINT,Ctrk+\,產生SIGQUIT,Ctrl+Z,產生SIGTSTP),內核發送相應的信號給前臺進程組中的所有進 程。

wKioL1ed_-LgSf2MAAEWtlEpEYs048.png

4.    守護(精靈)進程

守護進程(Daemon)是一種運行在後臺的一種特殊的進程,它獨立於控制終端並且週期性的 執行某種任務或等待處理某些發生的事件。由於在linux中,每個系統與用戶進行交流的界面成爲終端,每一個從此終端開始運行的進程都會依附於這個終端, 這個終端被稱爲這些進程的控制終端,當控制終端被關閉的時候,相應的進程都會自動關閉。但是守護進程卻能突破這種限制,它脫離於終端並且在後臺運行,並且 它脫離終端的目的是爲了避免進程在運行的過程中的信息在任何終端中顯示並且進程也不會被任何終端所產生的終端信息所打斷。它從被執行的時候開始運轉,知道 整個系統關閉才退出(當然可以認爲的殺死相應的守護進程)。如果想讓某個進程不因爲用戶或中斷或其他變化而影響,那麼就必須把這個進程變成一個守護進程。

wKioL1eeuAuwVvSCAAEi4lecybU949.png

wKiom1eeuBuRppZEAABxdhLVgeE460.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章