程序關係之作業控制

2022-05-04 20:12:26 字數 1568 閱讀 1135

作業控制,它允許在乙個終端上啟動多個

作業(程序組),它控制哪乙個作業可以訪問該終端,以及哪些作業在後台執行。作業控制要求下面三種形式的支援:

(1)支援作業控制的shell。

(2)核心中的終端驅動程式必須支援作業控制。

(3)核心必須提供對某些作業控制訊號的支援。

從shell使用作業控制功能角度講,使用者可以在前台或後台啟動乙個作業。乙個作業只是幾個程序的集合,通常是乙個程序的管道線。例如:

vi main.c

在前台啟動了只有乙個程序組成的乙個作業。命令:

pr *.c | lpr &

make all &

在後台啟動了兩個作業。這兩個後台作業呼叫的所有程序都在後台執行。

當啟動乙個後台作業時,shell賦予它乙個作業標識,並列印乙個或幾個程序id。

我們可以鍵入乙個影響前台作業的特殊字元——掛起鍵(一般採用ctrl+z)與終端驅動程式進行互動。鍵入此字元使終端驅動程式將訊號sigtstp送至前台程序組中的所有程序,後台程序組作業則不受影響。實際上有下面三個特殊字元可使終端驅動程式產生訊號,並將它們送至前台程序組:

中斷字元(一般採用delete或ctrl+c)產生sigint。

退出字元(一般採用ctrl+\)產生sigquit。

掛起字元(一般採用ctrl+z)產生sigtstp。

終端驅動程式必須處理與作業控制有關的另一種情況。我們可以有乙個前台作業和若干個後台作業,這些作業中哪乙個接受我們在終端上鍵入的字元呢?只有前台作業接收終端輸入如果後台作業試圖讀終端,那麼這並不是乙個錯誤,但是終端驅動程式將檢測這種情況,並且向後台作業傳送乙個特定的訊號sigttin。該訊號通常會暫時停止此後台作業,而shell則向有關使用者發出這種情況的通知,然後使用者就可以用shell命令將此作業轉為前台作業執行,於是它就可以讀終端

如果後台作業輸出到控制終端又將發生什麼呢?這是乙個我們可以允許或禁止的選項。通常,可以用stty(1)命令改變這一選項。在使用者禁止後台作業寫到控制終端時(使用命令stty tostop(關於stty命令用法:如果後台作業輸出到控制終端,終端驅動程式將該寫操作標識為來自於後台程序,並向該作業傳送sigttou訊號。

終端i/o和終端產生的訊號總是從前台程序組連線到實際終端。

程序屬於乙個程序組,而程序組屬於乙個會話。會話可能有也可能沒有控制終端。如果它確實有乙個控制終端,則此終端裝置知道其前台程序的程序組id。這個值可以用tcsetpgrp函式在終端驅動程式中設定。前台程序組id是終端的乙個屬性,而不是程序的屬性。

本篇博文內容摘自《unix環境高階程式設計》(第二版),僅作個人學習記錄所用。關於本書可參考:

linux訊號之作業控制

posix.1 中與作業控制有關的訊號,如下 sigchld 子程序已停止或終止。在乙個程序終止或停止時,s i g c h l d訊號被送給其父程序。按系統預設,將忽略此訊號。如果父程序希望了解其子程序的這種狀態改變,則應捕捉此訊號。訊號捕捉函式中通常要呼叫w a i t函式以取得子程序i d和其...

Linux 程序間關係 終端 作業控制

一 程序間關係 3種 1.程序組 每個程序除了有乙個程序id之外,還屬於乙個程序組。程序組是乙個或多個程序的集合。通常,它們與同一作業相關聯,可以接收來自同一終端的各種訊號。每個程序組都有乙個唯一的程序組id。每個程序組都可以有乙個組長程序。組長程序標識的是,其程序組id等於其程序id 一般,預設每...

程序間關係 程序組 作業 會話

程序組 之前我們在檢視系統程序相關資訊時,會看到每乙個程序的id和其父程序的id等相關資訊,其中就有乙個pgid,代表的是組id。什麼是組id呢?程序除了有自己的乙個程序id之外,每乙個程序還屬於乙個程序組。而這其中的pgid就是組id,指明了該程序是屬於哪乙個程序組。那麼什麼是程序組呢?其實這個程...