Linux程式關係
Linux的程式相互之間有一定的關係。比如說,在
中,我們看到,每個程式都有父程式,而所有的程式以init程式為根,形成一個樹狀結構。我們在這裡講解程式組和會話,以便以更加豐富的方式了管理程式。
程式組 (process group)
每個程式都會屬於一個程式組(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,直到程式組中最後一個程式終結。
我們將一些程式歸為程式組的一個重要原因是我們可以將訊號傳送給一個程式組。程式組中的所有程式都會收到該訊號。我們會在下一部分深入討論這一點。
會話 (session)
更進一步,在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的許多地方應用。
總結
process group, pgid
session, sid, job, forground, background
fg, kill -pid, &, %
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31543790/viewspace-2676074/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux socke server程式設計:父程式和子程式關係LinuxServer程式設計
- GNU與Linux 的關係Linux
- Unix、Linux、GNU 關係梳理Linux
- 物件導向程式設計程式碼詳解(依賴關係,關聯關係,組合關係)物件程式設計
- 程式和產品的關係
- Linux檢視相關係統資訊Linux
- Linux Shell檔案之間的包含關係Linux
- android版本與linux核心版本對應關係AndroidLinux
- 程式執行緒協程關係執行緒
- 在Linux中,Unix和Linux之間的關係是什麼?Linux
- GNU是什麼?和Linux是什麼關係?Linux
- 雲端計算和Linux是什麼關係?Linux
- 孤兒程式與終端的關係
- 大資料與程式語言關係大資料
- 雲端計算和Linux什麼關係?linux雲端計算Linux
- Java中各程式碼層級的關係Java
- 102422關係
- 資料關係比較:相關性 vs 因果關係
- 執行緒與程式之間有什麼關係?Linux執行緒與程式有什麼區別?執行緒Linux
- 矩陣:橫向關係和縱向關係矩陣
- 【集合論】二元關係 ( 二元關係記法 | A 到 B 的二元關係 | 二元關係個數 | 二元關係示例 )
- linux和ubuntu區別是什麼?有什麼關係?LinuxUbuntu
- Linux中apt是什麼?和Dpkg有什麼關係?LinuxAPT
- 理解 virt、res、shr 之間的關係(linux 系統篇)Linux
- 理解virt、res、shr之間的關係(linux系統篇)Linux
- 【集合論】序關係 ( 哈斯圖示例 | 整除關係哈斯圖 | 包含關係哈斯圖 | 加細關係哈斯圖 )
- 統計學三大相關係數之Pearson相關係數、Spearman相關係數
- SQL 程式設計思想:一切皆關係SQL程式設計
- Java程式和執行緒關係及區別Java執行緒
- python 類關聯關係Python
- 表的關聯關係
- 多程式命名管通通訊【無血緣關係程式】PHP 版本PHP
- 集合類關係
- sqlalchemy關係操作SQL
- Future,FutureTaskCallable關係
- 你能否關係
- Elasticsearch 父子關係Elasticsearch
- 【物件導向依賴關係概念總結】物件導向程式設計的五種依賴關係物件程式設計