vfork和fork的區別

2021-06-05 19:12:02 字數 1583 閱讀 3877

兩者都是建立乙個子程序 

但是 :

1. 但是 vfork 並不將父程序的位址空間完全複製到子程序中,因為子程序會立即呼叫 exec(或exit),於

是也就不會存訪該位址空間。不過在子程序呼叫 e x e c或e x i t之前,它在父程序的空間中執行。

這種工作方式在某些 u n i x的頁式虛存實現中提高了效率

2. vfork和fork之間的另乙個區別是: vfork保證子程序先執行,在它呼叫 exec或exit之後父進

程才可能被排程執行。

(如果在呼叫這兩個函式之前子程序依賴於父程序的進一步動作,則會

導致死鎖。

)上面紅色字的驗證程式如下:摘自《unix環境高階程式設計》

#include #include "ourhdr.h"

int glob = 6;

char buf = "a write to stdout";

int main()

else

sleep(2);

printf("pid = %d , glob = %d , var = %d\n", getpid() , glob , var);

return 0;

}

執行後輸出結果:

a write to stdoutbefore fork

pid = 11058 , glob = 7 , var = 89

pid = 11057 , glob = 6 , var = 88

這個程式的結果是很明顯的"正確" ,, 因為fork 產生的子程序

複製了父程序的資源 , 但是他們是在不同的位址空間執行!

再看vfork的例子:摘自《unix環境高階程式設計》

#include #include "ourhdr.h"

int glob = 6;

int main()

printf("pid = %d , glob = %d , var = %d \n" , getpid(), glob , var);

exit(0);

}

這個程式執行的結果請看了::

before vfork

pid = 11213 , glob = 7 , var = 89 

vfork出的子程序居然改變了父程序中的變數值!

原因嘛就是前面說的:在子程序呼叫 e x e c或e x i t之前,它在父程序的空間中執行。

這種情況就像是乙個執行緒的行為了!

後記:子程序為什麼使用_exit退出

_exit並不執行標準i/o快取

的重新整理操作。如果用exit而不是_exit,則該程式的輸出是:

$ a.out

before vfork

從中可見,父程序 printf的輸出消失了。其原因是子程序呼叫了 exit,它重新整理開關閉了所有標準

i / o流,這包括標準輸出。雖然這是由子程序執行的,但卻是在父程序的位址空間中進行的,

所以所有受到影響的標準 i/o file物件都是在父程序中的。當父程序呼叫 printf時,標準輸出已

被關閉了,於是printf返回-1

fork 和vfork 的區別

一 fork 1.呼叫方法 include include pid t fork void 正確返回 在父程序中返回子程序的程序號,在子程序中返回0 錯誤返回 1 子程序是父程序的乙個拷貝。即,子程序從父程序得到了資料段和堆疊段的拷貝,這些需要分配新的記憶體 而對於唯讀的 段,通常使用共享記憶體的方...

fork和vfork的區別

fork 拷貝了乙份父程序的資料,也就是說父子之間互不干涉 vfork 與父程序共享同乙份資料 程式參考 include include include int main void else if pid 0 printf pid d,var d n getpid var return 0 執行結果...

fork與vfork的區別

1.fork函式介紹 include sys types.h include unistd.h pid t fork void 正確返回 父程序中返回子程序的程序號 子程序中返回0 單調用雙返回函式 錯誤返回 1 子程序是父程序的乙個拷貝。具體說,子程序從父程序那得到了資料段和堆疊段,但不是與父程序...