為什麼使用vfork()?
希望父子程序執行不同的**。例如:
網路服務程式中,父程序等待客戶端的服務請求,當請求達到時,父程序呼叫fork,使子程序處理該次請求,而父程序繼續等待下乙個服務請求到達。
vfork與fork的函式原型相同,用於建立新程序,而該新程序的目的是exec乙個新程式(執行乙個可執行的檔案)。
由於新程式將有自己的位址空間,因此vfork函式並不將父程序的位址空間完全複製到子程序中。
注意以下兩點:
1.子程序在呼叫exec或exit之前,在父程序的位址空間中執行。
2.vfork函式保證子程序先執行,在它呼叫exec或者exit之後,父程序才可能被排程執行。
view code
#include因為在_exit(#include
#include
#include
using
namespace std;
int glob = 6;
int main(void)
else
if (pid == 0)
printf("
in parents\n
");printf("
pid = %d, glob = %d, var = %d\n
", getpid(), glob, var);
return
0;}
0);之前子程序執行在父程序的位址空間中,所以對glob和var的++操作都最終在父程序中輸出了。
至於最後為什麼使用_exit而不是exit,見"linux學習之"exit函式""
程序控制之vfork函式
vfork函式的呼叫序列和返回值與fork相同,但兩者的語義不同。vfork用於建立乙個新程序,而新程序的目的是exec乙個新程式。vfork和fork一樣都建立乙個子程序,但是它並不將父程序的位址空間完全複製到子程序中,因為子程序會立即呼叫exec 或exit 於是也就不會存訪該位址空間。相反,在...
Linux之fork與vfork區別
建立乙個新程序的方法只有由某個已存在的程序呼叫fork 或vfork 1.fork 函式 返回值 成功 父程序 返回子程序的pid 子程序 返回0 失敗 父程序返回 1 子程序是父程序的乙個拷貝。即子程序從父程序得到資料段和堆 棧段的拷貝,這些需要分配新的記憶體 不是與父程序共享,而是單獨分配記憶體...
理解vfork函式
vfork這個函式,起初是在fork函式沒有實現寫實拷貝機制的時候出現的乙個東西。然而現在的fork的函式早已經支援寫實拷貝。提到寫實拷貝就多說幾句,在作業系統中,建立乙個子程序你就得給他分配程序所需的資源,如果每次建立子程序後都要拷貝父程序的資源有點太降低效率了。就是在這個環境下衍生出了vfork...