程序控制
fork函式
函式說明:建立乙個子程序。
函式原型:pid_t fork(void);
返回值:失敗返回-1;成功返回:① 父程序返回子程序的id(非負) ②子程序返回 0
pid_t型別表示程序id,但為了表示-1,它是有符號整型。(0不是有效程序id,init最小,為1)
注意返回值,不是fork函式能返回兩個值,而是fork後,父子程序需【各自】返回乙個。
迴圈建立n個子程序
一次fork函式呼叫可以建立乙個子程序。那麼建立n個子程序不能簡單的以for(i = 0; i < n; i++) 來實現,因為產生子函式後,子函式會再次進入迴圈體呼叫fork函式,也就是子函式也會再建立自己的子函式,從而形成裂變,最終的子函式個數是(2^n)-1。
正確的建立n個子程序的寫法如下:
#include #include #define childnum 5
int main(int argc, char **argv)
if (i == childnum) else
return 0;
}
getpid函式獲取當前程序id
pid_t getpid(void);
getppid函式
獲取當前程序的父程序id
pid_t getppid(void);
getuid函式
獲取當前程序實際使用者id
uid_t getuid(void);
獲取當前程序有效使用者id
uid_t geteuid(void);
getgid函式
獲取當前程序使用使用者組id
gid_t getgid(void);
獲取當前程序有效使用者組id
gid_t getegid(void);
程序共享
父子程序之間在fork後。有哪些相同,那些相異之處呢?
剛fork之後:
父子相同處: 全域性變數、.data、.text、棧、堆、環境變數、使用者id、宿主目錄、程序工作目錄、訊號處理方式...
父子不同處: 1.程序id 2.fork返回值 3.父程序id 4.程序執行時間 5.鬧鐘(定時器) 6.未決訊號集
似乎,子程序複製了父程序0-3g使用者空間內容,以及父程序的pcb,但pid不同。真的每fork乙個子程序都要將父程序的0-3g位址空間完全拷貝乙份,然後在對映至物理記憶體嗎?
當然不是!父子程序間遵循讀時共享寫時複製的原則。這樣設計,無論子程序執行父程序的邏輯還是執行自己的邏輯都能節省記憶體開銷。
重點注意!躲避父子程序共享全域性變數的知識誤區!
父子程序共享:1. 檔案描述符(開啟檔案的結構體) 2. mmap建立的對映區
特別的,fork之後父程序先執行還是子程序先執行不確定。取決於核心所使用的排程演算法。
Linux應用程式設計 程序通訊
通訊方式有管道pipe,訊號 一 pipe 管道分兩種無名管道,有名管道。1 無名管道 父程序和子程序可通過無名管道傳輸資料,管道有兩個口,一端寫一端讀,半雙工通訊。可以當作檔案進行操作,所以建立的管道會有兩個檔案描述符fds 0 和fds 1 fds 0 用於讀,fds 1 用於寫,關係如圖。實驗...
Linux應用程式設計之程序程式設計
程序同步 一組併發的程序按照一定的順序執行的過程稱為程序間的同步。獲取id include pid t getpid void 獲取本程序id pid t getppid void 在子程序中獲取父程序id 程序建立 include pid t fork void fork 的奇妙之處在於它被呼叫一...
Linux應用程式設計之程序程式設計
程序同步 一組併發的程序按照一定的順序執行的過程稱為程序間的同步。獲取id include pid t getpid void 獲取本程序id pid t getppid void 在子程序中獲取父程序id 程序建立 include pid t fork void fork 的奇妙之處在於它被呼叫一...