一個 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 下。
除了 job 控制,process 群組偶而也用在別的地方,因為群組有兩個有用的特點:parent process 可以等候特定群組的任一個 children (TLPI §26.1.2),和 signal 可以送給一個群組的全部成員 (TLPI §20.5)。
範例
此時,shell$ 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
bash、find、wc、sort、和 uniq 都在執行,全部屬於同一 session,session leader 是 bash,同時也是控制 process,其它 process 都是 bash 產生。session 全部分成三個群組,前景執行的群組是 sort 和 uniq,sort 是群組 leader。另外兩個群組背景執行,一個是 bash,另一個是 find 和 wc,find 是群組 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
沒有留言:
張貼留言