日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

對話 UNIX,第 8 部分: UNIX 進程( 三 )


圖 3. 進程 A 生成自身的克隆體
起初 , 進程 Z 是從進程 A 停止的地方開始執(zhí)行的 。也就是說 , 此后進程 Z 從指令 14 (Instruction 14) 處開始執(zhí)行 。進程 A 會在同一指令位置繼續(xù)執(zhí)行 。
一般來說 , 指令 14 處的編程邏輯將測試當前的進程是子進程還是父進程 , 也就是說 , 進程 Z 和進程 A 中的指令 14 分別判定這兩個進程是否為其他進程的后代或祖先 。為了以示區(qū)別 , fork() 系統(tǒng)調用在子進程中返回 0 , 但返回給父進程的卻是進程 Z 的進程 ID 。
在上次測試之后 , 進程 A 和進程 Z 會出現差異 , 每個進程會采用單獨的代碼路徑 , 就像路上出現岔道 , 每一個都會走上不同的分枝 。生成一個新進程的流程更多地被稱為分叉 , 這就像兩位旅行者走到了路上的岔道 。因此 , 系統(tǒng)調用被命名為 fork() 。
在分叉之后 , 進程 A 可能會繼續(xù)運行同一個應用程序 。而進程 Z 則可能立即發(fā)生變化 , 轉到另一個應用程序 。后一種操作會改變程序通過進程運行的內容 , 它被稱為執(zhí)行 , 但您可以把它看成是一次再生過程:雖然進程 ID 不變 , 但進程內部的指令會被新程序的指令完全取代 。圖 4 顯示的是稍后進程 Z 的狀態(tài) 。
圖 4. 進程 Z 現在獨立于它的祖先 , 即進程 A
分叉
您可以在自己的命令行 , 很方便地體驗分叉操作 。首先 , 打開一個新的 xterm 。(您現在可能會認識到 , xterm 就是它本身的進程 , 在 xterm 中 , shell 是由 xterm 產生的一個獨立進程) 。接下來 , 輸入:ps -o pid,ppid,uname,command,state,stime,time
您應該會看到類似這樣的內容: PID PPID USER COMMAND S STIME TIME
16351 16350 mstreic -bashS 11:23 00:00:00
16364 16351 mstreic ps -o pid,ppid,u R 11:24 00:00:00從該列表的 PPID 字段中 , 我們知道 ps 命令是 bash shell 的子進程 。(-bash 中的連字符說明 shell 實例是一個登錄 shell 。)為了運行 ps , bash 會分叉 , 創(chuàng)建一個新進程;新進程通過使用執(zhí)行 , 使其本身得以重生 , 轉化為 ps 的一個新的實例 。
這里是另一個可供嘗試的實驗 。鍵入:sleep 10 & sleep 10 & sleep 10 & ps -o pid,ppid,uname,command,state,stime,time
您應該會看到類似這樣的內容:$ sleep 10 & sleep 10 & sleep 10 & ps -o pid,ppid,uname,command,state,stime,time
 PID PPID USER COMMAND S STIME TIME
16351 16350 mstreic -bashS 11:23 00:00:00
16843 16351 mstreic sleep 10 S 11:42 00:00:00
16844 16351 mstreic sleep 10 S 11:42 00:00:00
16845 16351 mstreic sleep 10 S 11:42 00:00:00
16846 16351 mstreic ps -o pid,ppid,u R 11:42 00:00:00命令行生成四個新進程 。在每個 sleep 命令后鍵入 & , 在后臺運行每一個命令 , 或與 Shell 并行 。ps 是生成的另一個進程 , 但它是在前臺運行的 , 可以防止 shell 在該進程終止之前運行其他命令 。而且 , 如 PPID 的值所示 , 所有四個進程都是 Shell 的后代 。三個 sleep 命令都被標為 S , 因為沒有哪個進程會在它們睡眠時使用資源 。
為了方便起見 , shell 會持續(xù)跟蹤它生成的所有后臺進程 。鍵入 jobs , 可以看到一個列表:
$ sleep 10 & sleep 10 & sleep 10 &
[1] 16843
[2] 16844
[3] 16845
$ jobs
[1]Running sleep 10 &
[2]Running sleep 10 &
[3]Running sleep 10 &此處 , 為了方便起見 , 三個工作分別用標簽標為 1 , 2 和 3 。數字 16843、16844 和 16845 分別是每個進程的進程 ID 。因此 , 后臺任務 1 即為進程 ID 16843 。
您可以利用這些標簽 , 從命令行操作您的后臺工作 。例如 , 如要終止某個命令 , 鍵入 kill %N , 其中 N 是該命令的標簽 。如要將某個命令由后臺移到前臺 , 請鍵入 fg %N :

推薦閱讀