ps -o pid,pgid,ppid,comm | cat
pid pgid ppid command
17906 17906 17905 bash
18011 18011 17906 ps
18012 18011 17906 cat
1.程序組
pid為程序自身的id,pgid為程序所在的程序組的id, ppid為程序的父程序id。從上面的結果,我們可以推測出如下關係:
每個程序都會屬於乙個程序組(process group),每個程序組中可以包含多個程序。程序組會有乙個
程序組領導程序
(process group leader),領導程序的pid (pid見
linux程序基礎
)成為程序組的id (process group id,
pgid
),以識別程序組。
2. 會話 (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
訊號可以通過kill
$kill -sigterm -10141 或者
$kill -sigterm %1
的方式來傳送給工作組。上面的兩個命令,乙個是傳送給pgid(通過在pgid前面加-來表示是乙個pgid而不是pid),乙個是傳送給工作1(%1),兩者等價。
乙個工作可以通過$fg從後台工作變為前台工作:
$cat > log &
$fg %1
當我們執行第乙個命令後,由於工作在後台,我們無法對命令進行輸入,直到我們將工作帶入前台,才能向cat命令輸入。在輸入完成後,按下ctrl+d來通知shell輸入結束。
記憶體空間
text區域用來儲存指令(instruction),來告訴程式每一步的操作。global data用於存放全域性變數,stack用於存放區域性變數,heap用於存放動態變數 (dynamic variable. 程式利用malloc系統呼叫,直接從記憶體中為dynamic variable開闢空間)。text和global data在程序一開始的時候就確定了,並在整個程序中保持固定大小。
一點Linux小知識 使用者和組
建立乙個新使用者組 groupadd 使用者組名字刪除乙個使用者組 groupadel 使用者組名字重新命名乙個使用者組 groupmod n 新的使用者組名稱 舊的使用者組名稱建立乙個新使用者 useradd 使用者名字刪除乙個使用者 userdel r 使用者名稱修改使用者屬性 usermod ...
每天記錄一點小知識
1,2,3 reduce a,b undefined 1 2,3 reduce a,b a b 6 1 2,3 reduce a,b 6function clone obj for var attr in obj return copy msg 分頁函式 param data 分頁渲染的資料 par...
volatile的一點小知識
volatile是輕量級的synchronized。彙編指令中會加入lock字首避免指令重排並把寫緩衝區的所有資料重新整理到記憶體中保證可見性,但不保證原子性。記憶體屏障 一組處理器指令,實現對記憶體操作的順序限制。有volatile修飾的變數,在進行寫操作時,會發生兩件事 lock字首指令會引起處...