2020年8月7日 星期五

PROCESS GROUPS, SESSIONS, AND JOB CONTROL

一個 job 是一個指令或指令串,形成一個 process group。透過一個控制終端機 (Controlling Terminal) 可以進行多個 job,都屬於同一個 session (譯作「作業階段」),其中一個是 foreground process group,剩下都是 background process group,方便工作控制 (job control)。

建立 session 的 process 是 session leader,其 process ID (PID) 作為 session ID (SID),並連接一個 session 專用的控制終端機並成為其控制 process,讓使用者控制,其中 foreground process group 讀取控制終端機。Signal SIGINT (Ctrl-C)、SIGQUIT (Ctrl-\)、和 SIGSTP (Ctrl-Z) 會送到 foreground process group 中的所有 process。當控制終端機斷線時,控制 process 會收到 SIGHUP。

建立 process group 的 process 是 process group leader,其 PID 作為 process group ID (PGID)。process group 最後一個 process 結束或離開時結束。process group leader 未必是最後一個 process。

新 process 繼承親 process 的 SID、PGID、控制終端機等。檔案 /proc/PID/stat 可看到 PGID、SID、控制終端機的 major:monor ID 和控制 process 的 PID (見 proc(5))。

互動式登入時,登入的途徑是控制終端機,登入的 shell 成為 session leader 及控制行程,也是唯一 process group 的唯一成員。然後,從 shell 啟動的每個指令或指令串,都會建立一個或多個 process,全部收納在一個新的 process group。如果指令或指令串以 & 符號結束時,這個 process group 會在背景執行。這些都在同一個 session 下。

在視窗環境,控制終端機是 pseudoterminal,每個終端機視窗有獨立的 session,視窗起始的 shell 是 session leader。

除了 job 控制,process 群組偶而也用在別的地方,因為群組有兩個有用的特點:parent process 可以等候特定群組的任一個 children (TLPI §26.1.2),和 signal 可以送給一個群組的全部成員 (TLPI §20.5)。

範例

$ echo $$                       # Display the PID of the shell
400
$ find / 2> /dev/null | wc -l & # Create 2 processes in background group
[1] 659
$ sort < longlist | uniq -c     # Create 2 processes in foreground group
此時,shell bashfindwcsort、和 uniq 都在執行,全部屬於同一 session,session leader 是 bash,同時也是控制 process,其它 process 都是 bash 產生。session 全部分成三個群組,前景執行的群組是 sortuniqsort 是群組 leader。另外兩個群組背景執行,一個是 bash,另一個是 findwcfind 是群組 leader。
$ echo $$                       # Display the PID of the shell
4056
$ find / 2> /dev/null | wc -l & # Create 2 processes in background group
[1] 5781
$ ps -s 4056 -o comm,pid,sess,tt,pgrp,ppid,tpgid,state
COMMAND           PID  SESS TT        PGRP  PPID TPGID S
bash             4056  4056 pts/2     4056  1579  5782 S
find             5780  4056 pts/2     5780  4056  5782 R
wc               5781  4056 pts/2     5780  4056  5782 S
ps               5782  4056 pts/2     5782  4056  5782 R

用 ps 可看出各自指令的資訊,其中一開始的 shell 是 bash,PID 4056。SID (SESS) 等於 PID,所以是 session leader,連接終端機 pts/2。PGID (PGRP) 等於 PID,是群組 leader。沒其它 process 的 PGID 為 4056,是群組中唯一 process。parent PID (PPID) 是其它 process,但其它 process 都是 4056,也就是都是其產生。TPGID 可看出前景執行的群組是 5782,也就是 ps 指令,其它群組 4056 和 5780 都背景執行。5780 群組的指令包含 find 和 wc 兩個 process。

pid_t getpgrp(void); // 取得 PGID,如果和 PID 一致則是 process group leader

int setpgrp(pid_t pid, pid_t pgid); // 將 pid 的 porcess group 設為 pgid。pid 可以是自己或子 process (不能是 SID)。pgid ...

參考來源

TLPI §34.1

34.2 Process Groups
34.3 Sessions
34.4 Controlling Terminals and Controlling Processes
34.5 Foreground and Background Process Groups
34.6 The SIGHUP Signal
34.6.1 Handling of SIGHUP by the Shell
34.6.2 SIGHUP and Termination of the Controlling Process
34.7 Job Control
34.7.1 Using Job Control Within the Shell
34.7.2 Implementing Job Control
34.7.3 Handling Job-Control Signals
34.7.4 Orphaned Process Groups (and SIGHUP Revisited)
34.8 Summary
34.9 Exercises

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...