8 程序控制

2021-06-25 17:42:13 字數 1531 閱讀 2087

1、程序識別符號

每個程序都有唯一的整數數字表示的程序id(因為程序識別符號是唯一的,所以經常》被用作其它識別符號的一部分,保證其它識別符號的唯一性,例如作為檔名的一部分)

雖然程序id是唯一的,但是程序結束後,程序id可以重新分配給其他的新建的程序

(延遲重用法,保證新結束的程序的id不會立即被分配給新建的程序)

id=0的程序是排程程序(swap程序、系統程序),不執行任何磁碟上的程式,這個進

程是核心的一部分;id=1的程序是init程序(在自舉過程結束後由核心呼叫),讀取與系統初

始化相關的檔案,並將系統引導到乙個狀態,init程序不會終止,這是乙個普通使用者程序,

但是以超級使用者特權執行

#include /* 獲取程序id */

pid_t getpid(void);

pid_t getppid(void);

uid_t getuid(void);獲取實際使用者id

uid_t geteuid(void);獲取有效使用者id

gid_t getgid(void);獲取實際組id

gid_t getegid(void);獲取有效組id

2、fork函式

#include

pid_t fork(void)        返回值:子程序返回0,父程序返回子程序的id

fork函式中子程序返回0的原因是:id=0的程序只有乙個系統程序;乙個程序只有》乙個父程序,可以通過getppid函式獲取父程序id;乙個程序卻可以有多個子程序,沒有一》個函式可以獲取所有的子程序id

父子程序享有共有的正文段;但是fork之後,子程序是父程序的副本(子程序獲取》父程序的堆疊資料的副本),程序之間沒有共享資料空間,沒有關係。

fork之後常有exec,所以fork建立子程序之後通常並不執行父程序資料段、棧和堆

的完全複製,而是採用寫時複製,  這些區域父子程序共有,但是核心把它們的許可權程式設計是

唯讀的;如果任何乙個試圖修改這些區域,則核心只為這些要修改的區域製作乙個副本,供

修改方使用

fork的檔案共享:

fork之後,父程序中原先被開啟的檔案描述符也會被複製到子程序中,父子程序打

開同乙個檔案描述符使用相同的檔案表項

fork之後,父子程序在開啟的同乙個檔案中,使用相同的檔案偏移量,但是檔案表》項不同步;可能導致輸入或者輸出相互混合

fork之後的檔案描述符有兩中常見的操作:

1、父程序等待子程序完成;父程序無需做任何操作,子程序完成之後,所進行的》讀寫操作的任何檔案描述符的檔案偏移量都已經進行了更新

2、父子程序各自執行不同的程式段;這種情況下父子程序各自關閉不需要使用的》檔案描述符,這樣就不會干擾到對方使用的檔案描述符,這種方法在網路服務中經常使用

fork使用方法無外乎兩種:

1、父程序希望複製自己,是父子程序同時執行不同的**段;在網路服務中,父》程序得到客戶端的服務請求,請求到達時候,父程序呼叫fork,子程序中處理這種請求,父

程序則繼續等待下乙個服務請求

2、乙個程序要執行乙個不同的程式;子程序從fork返回之後,直接執行exec函式

第8章 程序控制

pid t getppid void 返回值 呼叫程序的父程序id uid t getuid void 返回值 呼叫程序的實際使用者id uid t geteuid void 返回值 呼叫程序的有效使用者id gid t getgid void 返回值 呼叫程序的實際組id gid t getegi...

第8章節 程序控制

1.每乙個程序都有唯一的乙個非負整數程序id 2.核心態 程序呼叫了系統api 注意不是標準庫函式 正在執行核心 的狀態 使用者態 正在執行的是使用者編寫的 狀態 3.核心自舉 自舉是指上電自檢,即核心檢查硬體平台都擁有什麼硬體,為硬體載入驅動,最終載入根文 件系統並執行第乙個程序。程序id 1的程...

第8章程序控制總結

1 父子程序的程式空間 子程序獲得父程序的資料空間 堆 棧的副本,即不共享這些空間 父子程序共享正文段 不過現在又很多實現採用cow寫時複製技術,即共享空間,發生修改時只為修改區域製作副本 2 檔案共享 父子程序各自維護程序表項 記錄有檔案描述符 檔案描述符標誌 檔案表指標 父子程序共享檔案表 記錄...