一、程序
程序id為1是init程序,在自舉過程結束時由核心呼叫。
程序id為2是頁精靈程序,此程序負責支援虛存系統的請頁操作。也是核心程序。
二、fork
對於父程序已經終止的所有程序,它們的父程序都改變為init程序,我們稱這些程序由init程序領養。
此保證了每個程序有乙個父程序。
init被編寫成只要有乙個子程序終止,init就會呼叫乙個wait函式取得其終止狀態。防止系統中有很多僵死程序。
三、wait和waitpid函式
1、當乙個程序正常或異常終止時,核心就向其父程序發生sigchld訊號。
2、兩個函式的區別
在乙個子程序終止前,wait使其呼叫者阻塞,而waitpid有一選擇項,可使呼叫者不阻塞。
waitpid並不等待第乙個終止的子程序--它有許多個選擇項,可以控制它所等待的程序。
四、exec函式
exec函式在當前程序中載入並執行包含可執行檔案a.out中的程式,用a.out有效地替代了當前程式:
載入a.out的步驟:
刪除已經存在的使用者區域
對映私有區域、共享區域
設定程式計數器
五、程序的終止
1、五種方式
2、正常:
從main返回
呼叫exit
呼叫_exit
3、異常:
呼叫abort
由乙個訊號終止
4、exit和_exit區別
_exit立即進入核心,由posix.1說明,而exit則先執行一些清除處理(呼叫各終止處理程式,關閉所有標準io流等),
然後進入核心,由ansi c說明。
5、核心使程式執行的唯一方法是呼叫乙個exec函式。
6、程序自願終止的唯一方法是顯式呼叫_exit函式或隱式地呼叫_exit(通過呼叫exit)。
程序也可以非自願的由乙個訊號使其終止。
六、終端登入
1、系統管理者建立乙個通常名為/etc/ttys的檔案,其中,每個終端裝置有一行,每一行說明裝置名和傳到getty程式的引數。
當系統自舉時,核心建立程序id1,也就是init程序。init程序使系統進入多使用者狀態。
init讀檔案/etc/ttys,對每乙個允許登入的終端裝置,呼叫一次fork,它所生成的子程序則執行程式getty。
2、getty對終端裝置呼叫open函式,以讀、寫方式將終端開啟。
一旦裝置被開啟,則檔案描述符0、1、2就被設定到該裝置,然後getty輸出「login:」之類的資訊,並等待使用者鍵入使用者名稱。
3、當使用者鍵入使用者名稱後,getty就完成了,然後呼叫login程式。
4、因為最初的init程序具有超級使用者優先權,所以其上所有程序都具有超級使用者優先權。
5、如果使用者登入正確,login就將當前工作目錄更改為該使用者的起始目錄,它也呼叫chown改變終端的所有權。
6、然後登入shell,類似於 execl("/bin/sh", "-sh", (char *)0);
7、至此,登入使用者的登入shell開始執行,其父程序id是init程序(id為1),所以當此登入shell終止時,init會得到通知,它會
對該終端重複全部上述過程。
七、網路登入
1、網路登入,所有登入都經由核心的網路介面驅動程式,事先並不知道將會有多少這樣的登入。
有乙個稱為inetd的程序,它等待大多數網路連線。
2、作為系統啟動的一部分,init呼叫乙個shell,使其執行shell指令碼/etc/rc。由此shell指令碼啟動乙個精靈程序inetd。一旦此shell
指令碼終止,inetd的父程序就變成init。inetd等待tcpip連線請求到達主機,而當乙個連線請求到達時,它執行一次fork,然後
該子程序執行適當的程式。
3、telnetd程序開啟乙個偽終端裝置,並用fork生成乙個子程序。
父程序處理通過網路連線的通訊,子程序則執行login程式。父子程序通過偽終端相連線。
在呼叫exec之前,子程序使其檔案描述符0、1、2與偽終端相連。
八、程序組
每個程序處理有乙個程序id之外,還屬於乙個程序組。
每個程序組有乙個組長程序,其id等於程序組id。
九、對話期(session)
對話期是乙個或多個程序組的集合。
shell執行程式時,其程式為shell的子程序。
對於管道,則管道的最後乙個程序是登入shell的子程序。當該程序終止時,shell得到通知。
十、總結
程序是乙個抽象的概念,由作業系統來維持,所以可以當作是真實,認為就是乙個實實在在存在的。
程序涉及到了作業系統的方方面面,理解程序、程序間通訊是王道。
unix程序控制
我們寫原始碼編譯成可執行檔案,我們執行可執行檔案生成程序程序處理我們job,跟使用者打交道的就是進城了。每個程序都有自己 的程序標識 非負整數 是唯一的,但是程序標示是可以復用的 當乙個程序結束後它的程序id就可以被別的新程序使用。當然了每 個程序也有自己的程序空間,程序空間大家都很熟悉了,程序空間...
《unix高階環境程式設計》程序控制 程序ID
在unix系統中,每個程序都有乙個非負整型表示的唯一程序id。當乙個程序終止時,程序id可以重新被其他程序使用,為了防止誤判,unix系統實現延遲重用演算法,即新建的程序id不同於最近終止程序所使用的id。程序id為0的是排程程序,也稱為交換程序,是核心的一部分,不執行磁碟上的程式,因此也稱為系統程...
《unix高階環境程式設計》程序控制 程序時間
程序時間有牆上時鐘時間 使用者cpu時間和系統cpu時間。任一程序都可以呼叫 times 函式以獲得它自己以及終止子程序的上述值。cpp view plain copy 程序時間 返回值 若成功則返回流逝的牆上時鐘時間 單位 時鐘滴答數 若出錯則返回 1 函式原型 include clock t t...