进程组 会话 作业
一、進程組、作業、會話
1.進程組(process group)
每個進程除了有一個進程ID(保存在PCB當中),還屬于一個進程組。進程組由一個或多個進程組成,通常和一個作業相關聯,可以接收來自同一終端的各種信號。每個進程組有一個唯一的進程組ID。
每個進程組都有一個組長進程,組長進程的ID等于組ID。
組長進程可以組建一個進程組。只要進程組中有一個進程存在,這個進程組就存在。
2.作業(job)
當命令行上運行一個進程時,就會變成一個作業,這個作業可能是一個進程,也可能是多個進程。
shall有且只能運行一個前臺作業,當前臺有作業時,就不會運行其他作業,shell在后臺運行(此時不能接收指令),當作業終止,shall被提到前臺,可以接收指令
shell分前后臺來控制的不是進程而是作業或者進程組。一個前臺作業可以由多個進程組成,一個后臺作業也可以由多個進程組成。shell可以運行一個前臺作業和任意多個后臺作業。(作業控制)
*作業和進程組區別:如果作業中某個進程又創建子進程(fork),則子進程不屬于作業,屬于進程組。一旦前臺作業運行結束,shell就把自己提到前臺,若原來前臺進程還在(子進程還沒終止 ),則自動變為后臺進程組
3.會話(session )
會話是一個或多個進程組的集合。一個會話可以有一個控制終端。建立與控制終端連接的會話首進程被稱為控制進程(一般bash就是控制進程)。一個會話中幾個進程組可被分為一個前臺進程組和一個或多個后臺進程組。
一個會話中,應該包括控制進程(會話首進程)、一個前臺進程組和任意后臺進程組。
ctrl+c(SIGINT信號),ctrl+\(SIGQUOT),ctrl+Z(SIGTSTP)內核發送相應的信號給前臺進程組中所有進程。
切換用戶就是當前會話首進程起新進程組,每次su會加載新bash,每次打開終端也會新起一個bash
二、終端 1.基本概念 用戶通過登錄系統后獲得一個shell進程,這個終端稱為shell進程的控制終端,控制終端是保存在PCB中的信息。fork時會復制PCB中的信息,所以由shell進程啟動的其他進程的控制終端也是這個終端。默認情況下(未重定向)每個進程的標準輸入、標準輸出和標準作物都指向控制終端。在控制終端輸入一些特殊的控制鍵可給前臺進程發送信號(ctrl+c 、ctrl+Z等) 每個進程都可通過一個特殊的設備文件/dev/tty訪問控制終端 例: 1.一個進程要訪問它的控制終端可以通過dev/tty也可以通過該終端設備對應的設備文件來訪問 2.ttyname函數可由文件描述符查看對應文件名。該文件描述符必須指向一個終端設備而不是任意文件。
2.終端的登陸 一個pc通常只有一套鍵盤和顯示其,也就是只有一套終端設備,但可以通過Ctrl+Alt+F1~F6 切換到6個字符終端,相當于有6套虛擬終端設備,它們共同用一套物理終端設備,對應的設備文件為/dev/tty1~/dev/tty6 登陸過程: 1.系統啟動,init進程根據配置文件確定打開那些終端 2.getty根據命令行參數打開終端設備作為它的控制終端,把文件描述符0、1、2指向控制終端,然后提示用戶輸入賬號,當用戶賬號輸后,getty任務完成。 3.lofin程序提示用戶輸入密碼(輸入密碼期間關閉終端回顯),然后驗證賬號密碼的正確性。若密碼錯誤,login進程終止,init重新fork/exec一個getty,繼續步驟2;若正確,login設置一些環境變量,設置當前工作目錄為該用戶主目錄,然后執行shell 4.execl函數啟動bash,在bash前加“-”表示bash作為shell啟動,執行shell腳本
二、終端 1.基本概念 用戶通過登錄系統后獲得一個shell進程,這個終端稱為shell進程的控制終端,控制終端是保存在PCB中的信息。fork時會復制PCB中的信息,所以由shell進程啟動的其他進程的控制終端也是這個終端。默認情況下(未重定向)每個進程的標準輸入、標準輸出和標準作物都指向控制終端。在控制終端輸入一些特殊的控制鍵可給前臺進程發送信號(ctrl+c 、ctrl+Z等) 每個進程都可通過一個特殊的設備文件/dev/tty訪問控制終端 例: 1.一個進程要訪問它的控制終端可以通過dev/tty也可以通過該終端設備對應的設備文件來訪問 2.ttyname函數可由文件描述符查看對應文件名。該文件描述符必須指向一個終端設備而不是任意文件。
2.終端的登陸 一個pc通常只有一套鍵盤和顯示其,也就是只有一套終端設備,但可以通過Ctrl+Alt+F1~F6 切換到6個字符終端,相當于有6套虛擬終端設備,它們共同用一套物理終端設備,對應的設備文件為/dev/tty1~/dev/tty6 登陸過程: 1.系統啟動,init進程根據配置文件確定打開那些終端 2.getty根據命令行參數打開終端設備作為它的控制終端,把文件描述符0、1、2指向控制終端,然后提示用戶輸入賬號,當用戶賬號輸后,getty任務完成。 3.lofin程序提示用戶輸入密碼(輸入密碼期間關閉終端回顯),然后驗證賬號密碼的正確性。若密碼錯誤,login進程終止,init重新fork/exec一個getty,繼續步驟2;若正確,login設置一些環境變量,設置當前工作目錄為該用戶主目錄,然后執行shell 4.execl函數啟動bash,在bash前加“-”表示bash作為shell啟動,執行shell腳本
*getty->exec->login->execl->bash
.Session與進程組 shell可以同時運行一個 作業/進程組 和任意多個后臺?作業/進程組,這稱為作業控制。一個前臺作業可以由多個進程組成,一個后臺作業也可以由多個進程組成。 例: 啟動5個進程: ?$proc1 | proc2 & ? ? ?$proc3 | proc4 | proc5 其中:1.proc1和proc2屬于同一個后臺進程組(&表示后臺運行),proc3、proc4、proc5屬于同一個前臺進程組。shell進程屬于一個單獨的進程組。 2.這些進程控制終端相同,屬于同一個session。 3.當用戶在控制終端輸入特殊的控制鍵(ctrl+c等),內核發送相應的信號給前臺進程。
總結