關於fork函式

2021-06-01 06:05:37 字數 2233 閱讀 6945

我們可以使用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 函式後,系統先給新的程序分配資源,例如儲存資料和 的空間。然後把原來的程序的所有...