一、程序識別符號
#include
pid_t getpid(void);
返回值:呼叫程序的程序id
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函式
#include
pid_t fork(void);
返回值:子程序中返回0,父程序中返回子程序id,出錯返回-1
子程序和父程序繼續執行fork呼叫之後的指令,子程序是父程序的副本。父、子程序共享正文段。
檔案共享:
fork的乙個特性是父程序的所有開啟檔案描述符都被複製到子程序中。父子程序的每個相同的開啟描述符共享乙個檔案表項。
除了開啟檔案外,父程序的很多其他屬性也由子程序繼承,包括
(1)實際使用者id、實際組id、有效使用者id、有效組id
(2)附加組id
(3)程序組id
(4)會話id
(5)控制終端
(6)設定使用者id標誌和設定組id標誌
(7)當前工作目錄
(8)根目錄
(9)檔案模式建立遮蔽字
(10)訊號遮蔽和安排
(11)針對任一開啟檔案描述符的在執行時關閉(close-on-exec)標誌
(12)環境
(13)連線的共享儲存段
(14)儲存對映
(15)資源限制
父、子程序之間的區別是:
(1)fork的返回值
(2)程序id不同
(3)兩個程序具有不同的父程序id
(4)子程序的tms_utime、tms_stiem、tms_cutime以及tms_ustime均被設定為0
(5)父程序設定的檔案鎖不會被子程序繼承
(6)子程序的未處理的鬧鐘被清除
(7)子程序的未處理訊號集設定為空集
建立程序vfork函式
vfork用於建立乙個新程序,而該新程序的目的是exec乙個新程式,在子程序呼叫exec或exit之前,它在父程序的位址空間執行。
vfork與fork的另乙個區別:vfork保證子程序先執行,在它呼叫exec或exit之後父程序才可能被高度執行。如果在呼叫這兩個函式之前子程序依賴於父程序的進一步動作,則會導致死鎖。
exit函式
如果父程序在子程序之前終止,對於父程序已經終止的所有程序,它們的父程序都改變為ini程序。只要有乙個子程序終止,init就會呼叫乙個wait函式取得其終止狀態。
乙個已經終止、但是其父程序尚未對其進行善後處理(獲取終止子程序的有關資訊,釋放它仍占有的資源)的程序被稱為僵死程序(zombie)。核心為每個終止子程序儲存了一定量的資訊,所以當終止程序的父程序呼叫wait或waitpid時,可以得到這些資訊。
wait和waitpid函式
當乙個程序正常或異常終止時,核心就向其父程序傳送sigchld訊號。呼叫wait或waitpid時可能發生的情況:
(1)如果其所有子程序都還在執行,則阻塞
(2)如果乙個子程序已終止,正等待父程序獲取其終止狀態,則取得該子程序的終止狀態立即返回
(3)如果它沒有任何子程序,則立即出錯返回
#include
pid_t wait(int *statloc);
pid_t waitpid(pid_t pid, int *statloc, int options);
兩個函式返回值:若成功則返回程序id,若出錯則返回-1
兩個函式的區別:
(1)在乙個子程序終止前,wait使其呼叫者阻塞,而waitpid有乙個選項,可使呼叫者不阻塞
(2)waitpid並不等待在其呼叫之後的第乙個終止子程序,它有若干選項,可以控制它所等待的程序
兩個函式的statloc是乙個整形指標,可通過巨集檢查終止狀態。
pid引數作用解釋:
pid == -1 等待任一子程序。就這一方面而言,waitpid與wait等效
pid > 0 等待其程序id與pid相等的子程序
pid == 0 等待其組id等於呼叫程序組id的任一子程序
pid < -1 等待其組id等於pid絕對值的任一子程序
exec函式
當程序呼叫一種exec函式時,該程序執行的程式會完全替換為新程式,而新程式則從其main函式開始執行。因為呼叫exec並不建立新程序,所以前後的id並未改變。exec只是用乙個全新的程式替換了當前程序的正文、資料、堆和棧段。
#include
int execl(const char *pathname, const char *arg0, ... /* (char *) 0 */);
int execv(const char *pathname, char *const argv[ ]);
int execle(const char *pathname, const char *arg0, ... /* (char *)0, char *const envp[ ] */);
int execve(const char *pathname, char *const argv[ ], char *const envp[ ]);
int execlp(const char *filename, const char *arg0, ... /* (char *)0 */);
int execvp(const char *filename, char *const argv[ ]);
六個函式的返回值:若出錯則返回-1,成功則不返回值
注:如果filename中包含/,則將其視為路徑名(與execl或execv一樣?)
否則就按path環境變數,在它所指定的各目錄中搜尋可執行檔案。
(l表示list,v表示向量vector,p表示該函式取filename作為引數),以e結尾的兩個函式可以傳遞乙個指向環境字串指標陣列的指標。
Linux 程序控制(一)
計算機作業系統對於併發性和並行性的概念給出的定義是 並行性是指兩個或多個事件在同一時刻發生 併發性是指兩個或多個事件在同一時間段內發生。erlang 之父 joe armstrong 用一張5歲小孩都能看懂的 釋了併發與並行的區別 併發是兩個佇列交替使用一台咖啡機,並行是兩個佇列同時使用兩台咖啡機,...
linux 程序控制
什麼是程序 每乙個程序在系統中都有唯一的id標示它,此id為程序標示符 程序標示符的型別 pit t,其實是乙個無符號整形 乙個程序標示符對應唯一的乙個程序,多個程序標示符可以對應同乙個程式 程序和程式的區別 程式 可執行的二進位制 檔案,這種檔案載入到記憶體中執行就得到了乙個程序 程序 同乙個程式...
Linux程序控制
linux程序控制 獲取pid include include pid t getpdi void 獲取本程序id pdi t getppid vodi 獲取父程序id,及獲取建立子程序的程序id 程序建立 include pid t fork void 建立子程序 呼叫一次返回兩次值 1.父程序中...