Session與程序組

2021-06-21 07:36:12 字數 2863 閱讀 3184

在第 1 節 「訊號的基本概念」中我說過「shell可以同時執行乙個前台程序和任意多個後台程序」其實是不全面的,現在我們來研究更複雜的情況。事實上,shell分前後台來控制的不是程序而是作業(job)或者程序組(process group)。乙個前台作業可以由多個程序組成,乙個後台作業也可以由多個程序組成,shell可以同時執行乙個前台作業和任意多個後台作業,這稱為作業控制(job control)。例如用以下命令啟動5個程序:

$ proc1 | proc2 &

$ proc3 | proc4 | proc5

其中proc1proc2屬於同乙個後台程序組,proc3proc4proc5屬於同乙個前台程序組,shell程序本身屬於乙個單獨的程序組。這些程序組的控制終端相同,它們屬於同乙個session。當使用者在控制終端輸入特殊的控制鍵(例如ctrl-c)時,核心會傳送相應的訊號(例如sigint)給前台程序組的所有程序。各程序、程序組、session的關係如下圖所示(該圖出自[apue2e])。

圖 34.4. session與程序組

現在我們從session和程序組的角度重新來看登入和執行命令的過程。

gettytelnetd程序在開啟終端裝置之前呼叫setsid函式建立乙個新的session,該程序稱為session leader,該程序的id也可以看作session的id,然後該程序開啟終端裝置作為這個session中所有程序的控制終端。在建立新session的同時也建立了乙個新的程序組,該程序是這個程序組的process group leader,該程序的id也是程序組的id。

在登入過程中,gettytelnetd程序變成login,然後變成shell,但仍然是同乙個程序,仍然是session leader。

由shell程序fork出的子程序本來具有和shell相同的session、程序組和控制終端,但是shell呼叫setpgid函式將作業中的某個子程序指定為乙個新程序組的leader,然後呼叫setpgid將該作業中的其它子程序也轉移到這個程序組中。如果這個程序組需要在前台執行,就呼叫tcsetpgrp函式將它設定為前台程序組,由於乙個session只能有乙個前台程序組,所以shell所在的程序組就自動變成後台程序組。

在上面的例子中,proc3proc4proc5被shell放到同乙個前台程序組,其中有乙個程序是該程序組的leader,shell呼叫wait等待它們執行結束。一旦它們全部執行結束,shell就呼叫tcsetpgrp函式將自己提到前台繼續接受命令。但是注意,如果proc3proc4proc5中的某個程序又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

這個作業由pscat兩個程序組成,在前台執行。從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

這個作業由pscat兩個程序組成,在後台執行,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 使用...