Unix 程序控制

2021-05-21 18:41:41 字數 2297 閱讀 6189

一、程序

程序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...