我們可以使用fork呼叫建立乙個新程序,使用fork需包含的標頭檔案及fork的宣告如下:
#include
#include
pid_t fork(void);
這個系統呼叫複製當前程序,在程序表中建立乙個新的表項,新表項中的許多屬性與當前程序是完全相同的。新程序幾乎與原程序一模一樣,執行的**也完全相同,但新程序有自己的資料空間、環境和檔案描述符。fork和exec函式結合在一起使用就是建立新程序所需要的一切了。
如下圖所示:
由f o r k建立的新程序被稱為子程序(child process)。該函式被呼叫一次,但返回兩次。兩次返回的區別是子程序的返回值是0,而父程序的返回值則是新子程序的程序i d。將子程序i d返回給父程序的理由是:因為乙個程序的子程序可以多於乙個,所以沒有乙個函式使乙個程序可以獲得其所有子程序的程序i d。f o r k使子程序得到返回值0的理由是:乙個程序只會有乙個父程序,所以子程序總是可以呼叫g e t p p i d以獲得其父程序的程序i d (程序id 0總是由交換程序使用,所以乙個子程序的程序i d不可能為0 )。
子程序和父程序共享很多資源,除了開啟檔案之外,很多父程序的其他性質也由子程序繼承:
• 實際使用者i d、實際組i d、有效使用者i d、有效組i d。
• 新增組i d。
• 程序組i d。
• 對話期i d。
• 控制終端。
• 設定-使用者- i d標誌和設定-組- i d標誌。
• 當前工作目錄。
• 根目錄。
• 檔案方式建立遮蔽字。
• 訊號遮蔽和排列。
• 對任一開啟檔案描述符的在執行時關閉標誌。
• 環境。
• 連線的共享儲存段。
• 資源限制。
父、子程序之間的區別是:
• fork的返回值。
• 程序i d。
• 不同的父程序i d。
• 子程序的t m s _ u t i m e , t m s _ s t i m e , t m s _ c u t i m e以及t m s _ u s t i m e設定為0。
• 父程序設定的鎖,子程序不繼承。
• 子程序的未決告警被清除。
• 子程序的未決訊號集設定為空集。
使f o r k失敗的兩個主要原因是:( a )系統中已經有了太多的程序(通常意味著某個方面出了問題),或者( b )該實際使用者i d的程序總數超過了系統限制。回憶表2 - 7,其中c h i l d _ m a x規定了每個實際使用者i d在任一時刻可具有的最大程序數。
f o r k有兩種用法:
(1) 乙個父程序希望複製自己,使父、子程序同時執行不同的**段。這在網路服務程序中是常見的——父程序等待委託者的服務請求。當這種請求到達時,父程序呼叫f o r k,使子程序處理此請求。父程序則繼續等待下乙個服務請求。
(2) 乙個程序要執行乙個不同的程式。這對s h e l l是常見的情況。在這種情況下,子程序在從f o r k返回後立即呼叫e x e c。
我們從乙個例子程式中可以看到fork函式的作用,子程序與父程序之間的資源共享。
#include
#include
#include
int glob = 6;
char buf = "a write to stdout/n";
int main()
int var;
pid_t pid;
var = 88;
fprintf(stderr, "%s", buf);
printf("before fork/n");
if(( pid = fork() ) < 0 )
fprintf(stderr, "fork error/n");
else if(pid == 0)
glob++;
var++;
printf("child process/n");
printf("pid = %d, father pid = %d, glob = %d, var = %d/n", getpid(), getppid(), glob, var);
exit(0);
else
sleep(2);
printf("father process/n");
printf("pid = %d, father pid = %d, glob = %d, var = %d/n", getpid(), getppid(), glob, var);
return 0;
Linux 2 關於fork 函式
參考 理解下列 下面展示一些內聯 片。a code block var foo bar an highlighted block include include int main else printf 統計結果是 d n count return0 執行結果是 i am the child pro...
fork 函式 fork 函式的使用
fork的意思是個叉子,在unix及其衍生版linux中,用於建立子程序,現在看一下fork函式的基本用法。include includeint main printf c b fflush stdout fork printf c c fflush stdout 上圖的輸出是什麼呢?答案是 bab...
c 中的fork函式 FORK()函式
乙個程序,包括 資料和分配給程序的資源。fork 函式通過系統呼叫建立乙個與原來程序幾乎完全相同的程序,也就是兩個程序可以做完全相同的事,但如果初始引數或者傳入的變數不同,兩個程序也可以做不同的事。乙個程序呼叫fork 函式後,系統先給新的程序分配資源,例如儲存資料和 的空間。然後把原來的程序的所有...