在第 1 節 「訊號的基本概念」中我說過「shell可以同時執行乙個前台程序和任意多個後台程序」其實是不全面的,現在我們來研究更複雜的情況。事實上,shell分前後台來控制的不是程序而是作業(job)或者程序組(process group)。乙個前台作業可以由多個程序組成,乙個後台作業也可以由多個程序組成,shell可以同時執行乙個前台作業和任意多個後台作業,這稱為作業控制(job control)。例如用以下命令啟動5個程序:
$ proc1 | proc2 &其中$ proc3 | proc4 | proc5
proc1
和proc2
屬於同乙個後台程序組,proc3
、proc4
、proc5
屬於同乙個前台程序組,shell程序本身屬於乙個單獨的程序組。這些程序組的控制終端相同,它們屬於同乙個session。當使用者在控制終端輸入特殊的控制鍵(例如ctrl-c)時,核心會傳送相應的訊號(例如sigint
)給前台程序組的所有程序。各程序、程序組、session的關係如下圖所示(該圖出自[apue2e])。
圖 34.4. session與程序組
現在我們從session和程序組的角度重新來看登入和執行命令的過程。
getty
或telnetd
程序在開啟終端裝置之前呼叫setsid
函式建立乙個新的session,該程序稱為session leader,該程序的id也可以看作session的id,然後該程序開啟終端裝置作為這個session中所有程序的控制終端。在建立新session的同時也建立了乙個新的程序組,該程序是這個程序組的process group leader,該程序的id也是程序組的id。
在登入過程中,getty
或telnetd
程序變成login
,然後變成shell,但仍然是同乙個程序,仍然是session leader。
由shell程序fork
出的子程序本來具有和shell相同的session、程序組和控制終端,但是shell呼叫setpgid
函式將作業中的某個子程序指定為乙個新程序組的leader,然後呼叫setpgid
將該作業中的其它子程序也轉移到這個程序組中。如果這個程序組需要在前台執行,就呼叫tcsetpgrp
函式將它設定為前台程序組,由於乙個session只能有乙個前台程序組,所以shell所在的程序組就自動變成後台程序組。
在上面的例子中,proc3
、proc4
、proc5
被shell放到同乙個前台程序組,其中有乙個程序是該程序組的leader,shell呼叫wait
等待它們執行結束。一旦它們全部執行結束,shell就呼叫tcsetpgrp
函式將自己提到前台繼續接受命令。但是注意,如果proc3
、proc4
、proc5
中的某個程序又fork
出子程序,子程序也屬於同一程序組,但是shell並不知道子程序的存在,也不會呼叫wait
等待它結束。換句話說,proc3 | proc4 | proc5
是shell的作業,而這個子程序不是,這是作業和程序組在概念上的區別。一旦作業執行結束,shell就把自己提到前台,如果原來的前台程序組還存在(如果這個子程序還沒終止),則它自動變成後台程序組(回顧一下例 30.3 「fork」)。
下面看兩個例子。
$ ps -o pid,ppid,pgrp,session,tpgid,comm | cat這個作業由pid ppid pgrp sess tpgid command
6994 6989 6994 6994 8762 bash
8762 6994 8762 6994 8762 ps
8763 6994 8762 6994 8762 cat
ps
和cat
兩個程序組成,在前台執行。從ppid
列可以看出這兩個程序的父程序是bash
。從pgrp
列可以看出,bash
在id為6994的程序組中,這個id等於bash
的程序id,所以它是程序組的leader,而兩個子程序在id為8762的程序組中,ps
是這個程序組的leader。從sess
可以看出三個程序都在同一session中,bash
是session leader。從tpgid
可以看出,前台程序組的id是8762,也就是兩個子程序所在的程序組。
$ ps -o pid,ppid,pgrp,session,tpgid,comm | cat &這個作業由[1] 8835
$ pid ppid pgrp sess tpgid command
6994 6989 6994 6994 6994 bash
8834 6994 8834 6994 6994 ps
8835 6994 8834 6994 6994 cat
ps
和cat
兩個程序組成,在後台執行,bash
不等作業結束就列印提示資訊[1] 8835
然後給出提示符接受新的命令,[1]
是作業的編號,如果同時執行多個作業可以用這個編號區分,8835是該作業中某個程序的id。請讀者自己分析ps
命令的輸出結果 程序 程序組
1.程序組 1 程序組,也稱之為作業,bsd與1980年前後向unix中增加的乙個新特性,代表乙個或多個程序的集合。每個程序都屬於乙個程序組,在waitpid函式和kill函式的引數中都曾經使用到,作業系統設計的程序組的概念,是為了簡化對多個程序的管理。當父程序建立子程序的時候,預設子程序與父程序屬...
Linux程序分析(二) 父子程序與程序組
ps命令一般用來顯示終端資訊和程序資訊,執行命令ps eo pid,comm,cmd可以輸出所有程序的資訊,e代表所有程序,後面三個引數是需要輸出的資訊。第一列pid是乙個整數,每乙個程序都有乙個唯一的pid來代表自己的身份,程序也可以根據pid來識別其他的程序。第二列command是這個程序的簡稱...
程序內和程序外Session
三種 session 1.inproc 程序內 asp.net 預設就是這種 優點 速度快 缺點 但記憶體小,儲存有限,易爆滿導致重啟資料丟失 程序外 可以在 iis或 aspnet 服務意外關閉時繼續保持狀態,注意此時儲存到 session 中的物件必須支援序列化 2.stateserver 使用...