UNIX程序組,會話期,作業控制

2021-05-23 21:01:11 字數 1960 閱讀 7245

在unix系統中,作業控制允許在乙個終端上啟動多個作業(程序組),控制哪乙個作業可以訪問該終端,以及哪些作業在後台執行。

為了支援作業控制,引入了程序組,會話期,控制終端等概念,還需要核心以一定的訊號支援。

一·程序組。

每乙個程序除了有乙個程序pid之外,還屬於乙個程序組,用程序組id表示。返回當前程序組id的系統呼叫為:

pid_t getpgrp();
每個程序組都有乙個組長程序,組長程序的標識是程序組id等於其程序id。

程序可以呼叫setpgid系統呼叫參加乙個現存的組或者建立乙個新的程序組。

int setpgid(pid_t pid, pid_t pgid);
這將pid程序的程序組id設定為pgid,如果兩者相等,則pid變為程序組的組長。

乙個程序只能為它自己或者它的子程序改變程序組id,如果pid為0,則代表自己,如果pgid為0,則由pid指定的程序id作為程序組id。

如果pid和pgid不等,而目前系統中不存在pgid的程序組,則出錯。

當用fork()產生乙個子程序後,子程序將繼承父程序的程序組id,也就是子程序和父程序屬於同乙個程序組。

二·對話期(session)

對話期是乙個或多個程序組的集合,對話期可以有乙個控制終端。例如,可以由以下的安排:

程序呼叫setsid函式可以建立乙個新的對話期。

pid_t setsid();
如果呼叫此函式的程序是乙個程序組的組長,則出錯。否則該函式建立乙個新的對話期,結果為:

1)該程序變為新的對話期的首程序。

2)此程序成為乙個新程序組的組長程序。新程序組的id為呼叫程序的程序id。

3)此程序沒有控制終端。

三。前台程序組,後台程序組

乙個對話期的幾個程序組可以被分成乙個前台程序組以及乙個或幾個後台程序組。

如果乙個對話期有乙個控制終端,那麼它有乙個前台程序組,其他程序組為後台程序組。

無論何時鍵入中斷鍵(ctrl-c)或者退出鍵(ctrl-/),就會造成中斷訊號sigint或者退出訊號sitquit送至前台程序組中的所有程序。

只有前台程序組中的程序可以接受終端輸入,如果後台程序組的程序試圖讀終端,那麼核心會傳送乙個特定的訊號sigttin給後台作業,這通常會停止(掛起)次後台作業。當用將次後台程序轉為前台程序後(移入前台程序組),會傳送乙個sigcont訊號給該程序,使該程序繼續執行。

四·測試

#include #include #include #include #include int main()    

setpgid(pid, 0);

if(pid > 0)

char buf[1024];

printf("child: %d %d/n", getpid(), getpgrp());

while(fgets(buf, 1024, stdin))

return 0;

}

該程式首先列印父程序的pid和程序組id,由於該程序由shell建立,所以會將該程序的程序組id設定為程序pid,是的該程序組屬於乙個新程序組,並且為前台程序組。然後fork出乙個子程序,此時子程序應該繼承父程序的程序組id,和父程序同屬於前台程序組,然後父子程序下一步都呼叫setpgid(pid, 0),這會確保把子程序設為乙個新的程序組的組長,並且該程序組為後台程序組。這個時候子程序列印自己的程序pid和程序組id,然後開始迴圈從終端讀入一行資料,並原樣輸入到終端,由於這個子程序屬於後台程序組,這會導致子程序被掛起(停止),所以螢幕上不會有什麼輸出。父程序先睡眠5秒鐘(給我足夠的時間來敲幾行字元演示子程序確實沒有輸出),然後設定子程序的組id為自己的組id,也就是將子程序移入前台程序組,然後傳送sigcont訊號給子程序,使子程序重新執行,由於這是子程序已經屬於前台程序組了,因此可以成功的讀入終端字元並顯示出來。

執行結果:

linux 程序組 會話期

在linux unix中,有這樣幾個概念 根據posix.1定義 因此當網路斷開或終端視窗關閉後,控制程序收到sighup訊號退出,會導致該會話期內其他程序退出。我們來看乙個例子。開啟兩個ssh終端視窗,在其中乙個執行top命令。root tivf09 root top 在另乙個終端視窗,找到top...

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

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

程序組 會話 控制終端

程序組 程序組是乙個或多個程序的集合,每個程序都屬於乙個程序組,程序組有唯一組id。同一程序組中的各程序接收來自同一終端的各種訊號。pid t getpgrp void 返 用程序的程序組id 每個程序組有乙個組長程序,程序組id即為組長程序id。程序組組長可以建立乙個程序組 建立組中的程序,然後終...