兩者都是建立乙個子程序
但是 :
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 子程序是父程序的乙個拷貝。具體說,子程序從父程序那得到了資料段和堆疊段,但不是與父程序...