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