第8章 程序控制

2021-07-05 02:09:57 字數 2657 閱讀 7882

pid_t getppid(void); 返回值:呼叫程序的父程序id

uid_t getuid(void); 返回值:呼叫程序的實際使用者id

uid_t geteuid(void); 返回值:呼叫程序的有效使用者id

gid_t getgid(void); 返回值:呼叫程序的實際組id

gid_t getegid(void); 返回值:呼叫程序的有效組id

函式fork

#includepid_t fork(void) 

返回值:子程序返回0,父程序返回子程序id;若出錯,返回-1

vfork函式

vfork()會產生乙個新的子程序.但是vfork建立的子程序與父程序共享資料段,而且由vfork()建立的

子程序將先於父程序執行.

vfork()用法與fork()相似.但是也有區別,具體區別歸結為以下3點:

1. fork():子程序拷貝父程序的資料段,**段. vfork():子程序與父程序共享資料段.

2. fork():父子程序的執行次序不確定.

vfork():保證子程序先執行,在呼叫exec或_exit之前與父程序資料是共享的,在它呼叫exec

或_exit之後父程序才可能被排程執行。

3. vfork()保證子程序先執行,在她呼叫exec或_exit之後父程序才可能被排程執行。如果在

呼叫這兩個函式之前子程序依賴於父程序的進一步動作,則會導致死鎖。

4.當需要改變共享資料段中變數的值,則拷貝父程序。

函式exit

當程式執行到exit或_exit時,系統無條件的停止剩下所有操作,清除包括pcb在內的各種資料結構,並終止本程序的執行。 

函式wait和waitpid

#include /* 提供型別pid_t的定義 */

#include pid_t wait(int *status)

程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序,wait就會收集這個子程序的資訊,並把它徹底銷毀後返回;如果沒有找到這樣乙個子程序,wait就會一直阻塞在這裡,直到有乙個出現為止。

函式exc

fork函式是用於建立乙個子程序,該子程序幾乎是父程序的副本,而有時我們希望子程序去執行另外的程式,exec函式族就提供了乙個在程序中啟動另乙個程式執行的方法。它可以根據指定的檔名或目錄名找到可執行檔案,並用它來取代原呼叫程序的資料段、**段和堆疊段,在執行完之後,原呼叫程序的內容除了程序號外,其他全部被新程式的內容替換了。另外,這裡的可執行檔案既可以是二進位制檔案,也可以是linux下任何可執行指令碼檔案。

在linux中使用exec函式族主要有以下兩種情況

當程序認為自己不能再為系統和使用者做出任何貢獻時,就可以呼叫任何exec 函式族讓自己重生。

如果乙個程序想執行另乙個程式,那麼它就可以呼叫fork函式新建乙個程序,然後呼叫任何乙個exec函式使子程序重生

實際上,在linux中並沒有exec函式,而是有6個以exec開頭的函式族,下表列舉了exec函式族的6個成員函式的語法。

所需標頭檔案

#include

函式原型

int execl(const char *path, const char *arg, ...)

int execv(const char *path, char *const argv)

int execle(const char *path, const char *arg, ..., char *const envp)

int execve(const char *path, char *const argv, char *const envp)

int execlp(const char *file, const char *arg, ...)

int execvp(const char *file, char *const argv)

函式返回值

成功:函式不會返回這6 個函式在函式名和使用語法的規則上都有細微的區別,下面就可執行檔案查詢方式、參數列傳遞方式及環境變數這幾個方面進行比較說明。

①    查詢方式:上表其中前4個函式的查詢方式都是完整的檔案目錄路徑,而最後2個函式(也就是以p結尾的兩個函式)可以只給出檔名,系統就會自動從環境變數「$path」所指出的路徑中進行查詢。

②    引數傳遞方式:exec函式族的引數傳遞有兩種方式,一種是逐個列舉的方式,而另一種則是將所有引數整體構造成指標陣列進行傳遞。

出錯:返回-1,失敗原因記錄在error中

在這裡引數傳遞方式是以函式名的第5位字母來區分的,字母為「l」(list)的表示逐個列舉的方式,字母為「v」(vertor)的表示將所有引數整體構造成指標陣列傳遞,然後將該陣列的首位址當做引數傳給它,陣列中的最後乙個指標要求是null。讀者可以觀察execl、execle、execlp的語法與execv、execve、execvp的區別。

③    環境變數:exec函式族使用了系統預設的環境變數,也可以傳入指定的環境變數。這裡以「e」(environment)結尾的兩個函式execle、execve就可以在envp中指定當前程序所使用的環境變數替換掉該程序繼承的所以環境變數。

第8章程序控制總結

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

UNIX高階環境程式設計 第8章 程序控制

id為0的程序通常是排程程序 交換程序 屬於核心的一部分。id為1的程序是init程序,在自舉過程結束時由核心呼叫,該程序讀寫系統初始化檔案,將系統引導至乙個狀態 如多使用者 它是乙個普通使用者程序,但以超級使用者特權執行。函式宣告 include pid t fork 特性子程序的繼承特性正常終止...

第8章節 程序控制

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