UNIX高級環境編程 第9章 進程關係

第9章 進程關係

9.2 終端登錄

BSD終端登錄shell

clipboard.png

-------------------------------------------------Figure 1------------------------------------------------------網絡

9.3 網絡登陸

clipboard.png

-------------------------------------------------Figure 2------------------------------------------------------函數

9.4 進程組

pid_t getpgrp(void);
int setpgid(pid_t pid, pid_t pgid);

1. 進程調用setpgid能夠加入一個現有的進程組或者建立一個新進程組
2. setpgid函數將pid進程的進程組ID設置爲pgid。若是這兩個參數相等,則由pid指定的進程變成進程組組長
3. 一個進程只能爲它本身或它的子進程設置進程組ID。在它的子進程調用exec後,它就再也不更改該子進程的進程組IDspa

【【第三條意味着父子進程不必定處於同一個進程組】】code

9.5 會話

會話是一個或多個進程組的集合繼承

proc1 | proc2 &
proc3 | proc4 | proc5

clipboard.png

-------------------------------------------------Figure 3------------------------------------------------------
建立一個新會話的過程接口

pid_t setsid(void);

若調用此函數的進程不是一個進程組的組長,則此函數就會建立一個新會話,結果將發生下面3件事進程

1. 該進程變成新會話首進程(會話首進程是建立該會話的進程),此時該進程是新會話中的唯一進程
2. 該進程稱爲一個新進程組的組長進程。新進程組ID是該調用進程的進程ID
3. 該進程沒有控制終端。若是在調用setsid以前該進程有一個控制終端,那麼這種聯繫也會被中斷ip

如該調用進程已是一個進程組的組長,則此函數返回出錯。get

爲了保證不發生這種狀況,一般先調用fork,而後使其父進程終止,而子進程繼續。
由於子進程繼承了父進程的進程組ID,而其進程ID則是新分配的,二者不可能相等,因此這就保證子進程不會是一個進程組的組長。

pid_t getsid(pid_t pid);

獲取會話首進程的進程組ID

9.6 控制終端

會話和進程組的特性:

1. 一個會話能夠有一個控制終端。這一般是登陸到其上的終端設備(在終端登陸狀況下)或僞終端設備(在網絡登錄狀況下)
2. 創建與控制終端連接的會話首進程被稱爲控制進程
3. 一個會話中的幾個進程組可被分紅一個前臺進程組以及一個或幾個後臺進程組
4. 若是一個會話有一個控制終端,則它有一個前臺進程組,會話中的其餘進程組則爲後臺進程組
5. 不管什麼時候鍵入終端的中斷鍵,就會將中斷信號發送給前臺進程組的全部進程
6. 不管什麼時候鍵入終端的退出鍵,就會將退出信號發送給前臺進程組的全部進程
7. 若是終端接口檢測到調制解調器已經斷開鏈接,則將掛斷信號發送給控制進程

clipboard.png

-------------------------------------------------Figure 4------------------------------------------------------

9.8 做業控制

【定義】
做業控制 容許在一個終端上啓動多個做業(進程組),它控制哪個做業能夠訪問該終端以及哪些做業在後臺運行

實際上有三個特殊字符可以使終端驅動程序產生信號,並將它們送至前臺進程組,它們是:
中斷字符(通常採用DELETE或Ctrl-C)產生SIGINT
退出字符(通常採用Ctrl- 反斜槓)產生SIGQUIT
掛起字符(通常採用Ctrl-Z)產生SIGTSTP

只有前臺做業接收終端輸入,若是後臺做業試圖讀終端,那麼這並非一個錯誤,可是終端驅動程序檢測這種狀況,
而且發送一個特定信號SIGTTIN給後臺做業, 這一般會 【【中止】】 此後臺做業。

輸入 : 轉爲前臺進程的方法:

$ cat > temp.foo &                          在後臺啓動,但將從標準輸入讀
[1] 1681
$                                           鍵入回車
[1] + Stopped (tty input) cat > temp.foo &
$ fg %1                                     使1號做業成爲前臺做業
cat > temp.foo                              shell告訴咱們如今哪個做業在前臺
hello, world                                輸入1行
^D                                          鍵入文件結束符
$ cat temp.foo                              檢查該行已送入文件
hello, world

輸出 : 轉爲前臺進程的方法:

$ cat temp.foo &                             在後臺執行
[1] 1719
$ hello, world                               在提示符後出現後臺做業的輸出
                                             鍵入回車
[1] + Done cat temp.foo &
$ stty tostop                                禁止後臺做業向控制終端輸出 (【stty -tostop (啓用)】)
$ cat temp.foo &                             在後臺再次執行
[1] 1721
$                                            鍵入回車,發現做業已中止
[1] + Stopped(tty output) cat temp.foo &
$ fg %1                                      將中止的做業恢復爲前臺做業
cat temp.foo                                 shell告訴咱們如今哪個做業在前臺
hello, world                                 該做業的輸出

clipboard.png

-------------------------------------------------Figure 5------------------------------------------------------

9.10 孤兒進程組

【【定義】】
該組中每一個成員的父進程或者是該組的一個成員,或者不是該組所屬會話的成員。
對孤兒進程組的另外一種描述能夠是----一個進程組不是孤兒進程組的條件是:該組中有一個進程,其父進程在屬於同一對話期的另外一個組中。
若是進程組不是孤兒進程組,那麼在屬於同一對話期的另外一個組中的父進程就有機會從新起動該組中中止的進程。

clipboard.png

-------------------------------------------------Figure 5------------------------------------------------------
在a.out終止後,進程組(pgid=Z)成爲孤兒進程組,POSIX.1要求向新孤兒進程組中處於中止狀態的每個進程發送掛斷信號(SIGHUP),
接着又向其發送繼續信號(SIGCONT).在處理了掛斷信號後,子進程繼續。
對掛斷信號的系統默認動做是終止該進程,爲此必須提供一個信號處理程序以捕捉該信號。

ADDITION 進程狀態

源於這一章屢次提到進程的中止狀態(TASK_STOPPED):
R (TASK_RUNNING),可執行狀態。
S (TASK_INTERRUPTIBLE),可中斷的睡眠狀態。
D (TASK_UNINTERRUPTIBLE),不可中斷的睡眠狀態。
T (TASK_STOPPED or TASK_TRACED),暫停狀態或跟蹤狀態。
Z (TASK_DEAD - EXIT_ZOMBIE),退出狀態,進程成爲殭屍進程。

注意 S與D的區別,T和S的區別

相關文章
相關標籤/搜索