Linux程序組和會話

2022-07-31 22:21:12 字數 1996 閱讀 6045

linux的程序相互之間有一定的關係。比如說,在linux程序基礎中,我們看到,每個程序都有父程序,而所有的程序以init程序為根,形成乙個樹狀結構。我們在這裡講解程序組和會話,以便以更加豐富的方式了管理程序。

每個程序都會屬於乙個程序組(process group),每個程序組中可以包含多個程序。程序組會有乙個程序組領導程序 (process group leader),領導程序的pid (pid見linux程序基礎)成為程序組的id (process group id, pgid),以識別程序組。

$ps -o pid,pgid,ppid,comm | cat

pid  pgid  ppid command

17763 17763 17751 bash

18534 18534 17763 ps

18535 18534 17763 cat

pid為程序自身的id,pgid為程序所在的程序組的id, ppid為程序的父程序id。從上面的結果,我們可以推測出如下關係:

圖中箭頭表示父程序通過fork和exec機制產生子程序。ps和cat都是bash的子程序。程序組的領導程序的pid成為程序組id。領導程序可以先終結。此時程序組依然存在,並持有相同的pgid,直到程序組中最後乙個程序終結。

我們將一些程序歸為程序組的乙個重要原因是我們可以將訊號傳送給乙個程序組。程序組中的所有程序都會收到該訊號。我們會在下一部分深入討論這一點。

更進一步,在shell支援工作控制(job control)的前提下,多個程序組還可以構成乙個會話 (session)。bash(bourne-again shell)支援工作控制,而sh(bourne shell)並不支援。

會話是由其中的程序建立的,該程序叫做會話的領導程序(session leader)。會話領導程序的pid成為識別會話的sid(session id)。會話中的每個程序組稱為乙個工作(job)。會話可以有乙個程序組成為會話的前台工作(foreground),而其他的程序組是後台工作(background)。每個會話可以連線乙個控制終端(control terminal)。當控制終端有輸入輸出時,都傳遞給該會話的前台程序組。由終端產生的訊號,比如ctrl+z, ctrl+\,會傳遞到前台程序組。

會話的意義在於將多個工作囊括在乙個終端,並取其中的乙個工作作為前台,來直接接收該終端的輸入輸出以及終端訊號。 其他工作在後台執行。

乙個命令可以通過在末尾加上&方式讓它在後台執行:

$ping localhost > log &

此時終端顯示:

[1] 10141

括號中的1表示工作號,而10141為pgid

我們通過如下方式查詢更加詳細的資訊:

$ps -o pid,pgid,ppid,sid,tty,comm

(tty表示控制終端)

訊號可以通過kill

$kill -sigterm -10141

或者$kill -sigterm %1

的方式來傳送給工作組。上面的兩個命令,乙個是傳送給pgid(通過在pgid前面加-來表示是乙個pgid而不是pid),乙個是傳送給工作1(%1),兩者等價。

乙個工作可以通過$fg從後台工作變為前台工作:

$cat > log &

$fg %1

當我們執行第乙個命令後,由於工作在後台,我們無法對命令進行輸入,直到我們將工作帶入前台,才能向cat命令輸入。在輸入完成後,按下ctrl+d來通知shell輸入結束。

程序組(工作)的概念較為簡單易懂。而會話主要是針對乙個終端建立的。當我們開啟多個終端視窗時,實際上就建立了多個終端會話。每個會話都會有自己的前台工作和後台工作。這樣,我們就為程序增加了管理和執行的層次。在沒有圖形化介面的時代,會話允許使用者通過shell進行多層次的程序發起和管理。比如說,我可以通過shell發起多個後台工作,而此時標準輸入輸出並不被佔據,我依然可以繼續其它的工作。如今,圖形化介面可以幫助我們解決這一需求,但工作組和會話機制依然在linux的許多地方應用。

作用 和會話期 程序組 程序組和會話

程序組 程序組是指乙個或多個程序的集合。通常與乙個作業相關聯,可以接收來自同一終端的訊號。每個程序組有乙個唯一的程序組id,它類似於程序id,是乙個正整數 其實就是組長程序的程序id 可以通過函式獲得 include pid t getpgrp void 程序組都有乙個組長,組長程序的標識是其程序組...

關於程序和會話

oracle例項有兩種型別 單程序例項和多程序例項。單程序oracle 又稱單使用者oracle 是一種資料庫系統,乙個程序執行全部oracle 由於oracle部分和客戶應用程式不能分別以程序執行,所以oracle的 和使用者的資料庫應用是單個程序執行。在單程序環境下的oracle 例項,僅允許乙...

Linux 程序組 會話 守護程序

程序組 乙個或多個程序的集合 程序組id 正整數 兩個函式 getpgid 0 getpgrp eg 顯示子程序與父程序的程序組id 1 include 2 include 3 include 45 int main else if pid 0 1718 sleep 3 19 printf the ...