Unix環境高階程式設計筆記 8 程序控制

2021-08-27 15:30:36 字數 3466 閱讀 8784

1、程序識別符號

每個程序都有乙個非負整型表示的唯一程序id。

id為1通常是init程序,在自舉過程結束時由核心呼叫。該程序檔案在/etc/init

#include

gid_t getegid(void); 獲取有效使用者id

uid_t geteuid(void);

git_t getgid(void);

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

2、fork

#include

pid_t fork(void);        返回值:子程序中返回0,父程序中返回子程序id,出錯返回-1

fork函式被呼叫一次,但返回2次,二次返回的唯一區別是子程序返回值是0,而父程序的返回值是新子程序的程序id。 

子程序和父程序繼續執行fork呼叫之後的指令。子程序是父程序的副本。例如,子程序獲得父程序資料空間、堆和棧的副本。

父、子程序並不共享這些儲存空間部分,父、子程序共享正文段。

#include

#include

#include

int glob = 6;

char buf = "a write to stdout\n";

int main(int argc, char **argv)

printf("before fork");

if((pid = fork()) <0) if(pid == 0) else

printf("pid = %d,glob = %d,var = %d\n",getpid(),glob,var);

exit(0);

}

3、wait和waitpid函式

當乙個程序正常或異常終止時,核心就向其父程序傳送sigchld訊號。因為子程序終止是個非同步事件。

呼叫wait或waitpid程序可能發生什麼情況:

a)如果其所有子程序都還在執行,則阻塞。

b)如果乙個子程序已經終止,正等待父程序獲取其終止狀態,則取得該子程序的終止狀態立即返回。

c)如果它沒有任何子程序,則立即返回

#include

pid_t wait(int *statloc);

pid_t waitpid(pid_t pid,int *statloc,int options);

返回值:成功返回程序id,或出錯則返回-1

兩個函式的區別:

a)在乙個子程序終止前,wait使其呼叫者阻塞,而waitpid有乙個選項,可使呼叫者不阻塞。

b)waitpid並不等待在其呼叫之後的第乙個終止子程序,它有若干個選項,可以控制它所等待的程序。

這二個函式的引數statloc是乙個整形指標,如果statloc不是乙個空指標,則終止程序的終止狀態就存放在它所指向的單元內。如果不關心終止狀態,則可以

將該引數指定為空指標。

檢查wait和waitpid所返回的終止狀態的巨集

wifexited(status)

wifsignaled(status)

wifstopped(status)

wifcontinued(status)

列印程序終止狀態

#include

#include

#include

#include

void pr_exit(int status) else if (wifsignaled(status)) else if(wifstopped(status))

}

int main(int argc, char **argv) else if(pid == 0)

if(wait(&status) != pid)

pr_exit(status);

exit(0);

}

如果乙個程序有幾個子程序,那麼只要乙個子程序終止,wait就返回。

waitpid函式返回終止子程序的程序id,並將該子程序的終止狀態存放在由statloc指向的儲存單元中。

pid==-1        等待任一子程序,就這一方面而言,waitpid與wait等效。

pid > 0          等待其程序id與pid相等的子程序。

pid == 0        等待其組id等於呼叫程序組id的任一子程序。

pid < -1        等待其組id等於pid絕對值的任一子程序。 常量

說明wcontinued

whohang

wunttraced

若實現支援作業控制,那麼由pid指定的任一子程序在暫停後已經繼續,但其狀態尚未報告,則返回其狀態

若由pid指定的子程序並不是立即可用的,則waitpid不阻塞,此時其返回0

若某實現支援作業控制,而由pid指定的任一子程序處理於暫停狀態,並且其狀態自暫停以來還未報告過,則返回

其狀態

waitpid函式區別於wait

a)waitpid可等待乙個特定的程序,而wait則返回任一終止子程序的狀態

b)waitpid提供了乙個wait的非阻塞版本

c)waitpid支援作業控制

4、waitid

5、wait3 wait4

6、競爭條件

當多個程序都企圖對共享資料進行某種處理,而最後的結果又取決於程序執行的順序時,則我們認為這發生了竟爭條件(race condition)

7、exec函式

當程序呼叫exec函式時,該 程序執行的程式完全替換為新程式,而新程式則從其main函式開始執行。

因為呼叫exec並不建立新程序,所以前後程序的程序id並未改變。

exec只是用乙個全新的程式替換了當前程序的正文、資料、堆和棧段。

用fork可以建立新程序,用exec可以執行新程式。exit函式和二個wait函式處理終止和等待終止。這些是我們需要的基本的程序控制原語

#include

execl

execv

execle

execve

execlp

execvp

返回值 :若出錯則返回-1,若成功則不返回值

8、更改使用者id和組id

在unix系統中,特權是基於使用者和組id的。

當程式需要增加特權,或需要訪問當前並不允許訪問的資源時,我們需要更換自己的使用者id或組id,使得新id具有合適的特權或訪問許可權。

在設計應用程式時,我們總是試圖使用最小特權模型。   

#include

setuid

setgid

9、system   

#include

int system(const char *cmdstring);

10、使用者標識

#include

char *getlogin(void);

找到執行該程式的使用者登入名:可以呼叫 getpwuid(getuid())

getpwnam 在口令檔案中查詢使用者的相應記錄,確定其登入shell

UNIX環境高階程式設計筆記 8程序控制

程序識別符號 記住2個函式,可以獲得自身程序號和父程序號 pit t getpid void pie t getppid void fock函式 重點 1 fock函式呼叫一次,但是返回兩次,在子程序中返回0,父程序中返回子程序id。由於程序id不可能為0 id為0的為系統程序 且乙個子程序只可以有...

Unix環境高階程式設計筆記 7 程序環境

1 程序終止 a 程序終止的8種方式 從main返回 呼叫exit 呼叫 exit或 exit 最後乙個執行緒從其啟動程序返回 最後乙個執行緒呼叫pthread exit 呼叫abort 接到乙個訊號並終止 最後乙個執行緒對取消請求做出響應 b exit函式 exit和 exit立即進入核心,exi...

程序退出(UNIX環境高階程式設計筆記)

如果父程序fork了乙個子程序,父程序先於子程序終止,子程序的父程序將改為init程序。其大致操作是 在乙個程序終止時,核心諸葛檢查所有活動程序,以判斷它是否是正要終止程序的子程序,如果是,則該程序的父程序id就更改為1。核心為每個終止子程序儲存了一定量的資訊,當終止程序的父程序通過wait或wai...