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

UNIX 進程揭秘

分配給系統(tǒng)管理員的許多工作之一是確保用戶的程序正確運行 。因為系統(tǒng)上存在其他并發(fā)運行的程序,所以此任務變得更加復雜 。由于種種原因,這些程序可能會失敗、掛起或行為異常 。在構建更可靠的系統(tǒng)時,了解 Unix?環(huán)境如何創(chuàng)建、管理和銷毀這些作業(yè)是至關重要的步驟 。
開發(fā)人員還必須積極了解內(nèi)核如何管理進程,因為與系統(tǒng)的其他部分和睦相處的應用程序會占用更少的資源,并且不會頻繁地給系統(tǒng)管理員帶來麻煩 。由于導致僵死進程(將在稍后對其進行描述)而頻繁重新啟動的應用程序明顯是不可取的 。對控制進程的 UNIX 系統(tǒng)調(diào)用的了解可以使開發(fā)人員編寫能夠在后臺自動運行的軟件,而不是需要一個始終保持在用戶屏幕上的終端會話 。
管理這些程序的基本構件就是進程 。進程是賦予某個由操作系統(tǒng)執(zhí)行的程序的名稱 。如果您熟悉 ps 命令,則您應該熟悉進程清單,如清單 1 所示 。
清單 1. ps 命令的輸出
sunbox#ps -ef
UIDPID PPIDCSTIME TTY TIME CMD
root 0 00 20:15:23 ?0:14 sched
root 1 00 20:15:24 ?0:00 /sbin/init
root 2 00 20:15:24 ?0:00 pageout
root 3 00 20:15:24 ?0:00 fsflush
 daemon240 10 20:16:37 ?0:00 /usr/lib/nfs/statd
...
前三列對這里的討論非常重要 。第一列列出用于運行該進程的用戶身份,第二列列出進程的 ID,第三列列出該進程的父進程 ID 。最后一列是進程的描述,通常是所運行的二進制文件的名稱 。每個進程都被分配一個標識符,稱為進程標識符(Process IdentifIEr,PID) 。進程還有父進程,在大多數(shù)情況下就是啟動它的進程的 PID 。
父 PID (PPID) 的存在意味著這是一個由別的進程創(chuàng)建的進程 。最初創(chuàng)建進程的原始進程名為 init,它始終被賦予 PID 1 。init 是將在內(nèi)核啟動時啟動的第一個實際進程 。啟動系統(tǒng)的其余部分是 init 的工作 。init 和其他具有 PPID 0 的進程屬于內(nèi)核 。
使用 fork 系統(tǒng)調(diào)用
fork(2) 系統(tǒng)調(diào)用創(chuàng)建一個新進程 。清單 2 顯示了一個簡單 C 代碼片段中使用的 fork 。
清單 2. 簡單的 fork(2) 用法
sunbox$ cat fork1.c
#include
#include
int main (void) {
pid_t p; /* fork returns type pid_t */
p = fork();
printf("fork returned %dn", p);
}
sunbox$ gcc fork1.c -o fork1
sunbox$ ./fork1
fork returned 0
fork returned 698
fork1.c 中的代碼不過就是發(fā)出 fork 調(diào)用,并通過一個 printf 調(diào)用來打印整數(shù)結果 。雖然只發(fā)出了一個調(diào)用,但是打印了兩次輸出 。這是因為在 fork 調(diào)用中創(chuàng)建了一個新進程 ?,F(xiàn)在有兩個單獨的進程在從該調(diào)用返回結果 。這通常被描述為“調(diào)用一次,返回兩次 。
fork 返回的值非常有趣 。其中一個返回 0;另一個返回一個非零值 。獲得 0 的進程稱為子進程,非零結果屬于原始進程,即父進程 。您將使用返回值來確定哪個是父進程,哪個是子進程 。由于兩個進程都在同一空間中繼續(xù)運行,唯一有實際意義的區(qū)別是從 fork 返回的值 。
0 和非零返回值的基本原理在于,子進程始終可以通過 getppid(2) 調(diào)用來找出其父進程是誰,但是父進程要找出它的所有子進程卻很困難 。因此,要告訴父進程關于其新的子進程的信息,而子進程可在需要時查找其父進程 。
考慮到 fork 的返回值,現(xiàn)在該代碼可以檢查確定它是父進程還是子進程,并進行相應的操作 。清單 3 顯示了一個基于 fork 的結果來打印不同輸出的程序 。
清單 3. 更完整的 fork 用法示例
sunbox$ cat fork2.c
#include
#include
int main (void) {
pid_t p;
printf("Original program, pid=%dn", getpid());

推薦閱讀