vfork 與fork異同總結
前言調⽤fork或vfork函式是linux建立⼀個新程序的⽅法.
fork
由fork建立的新程序被稱為⼦程序(child process)。該函式被調⽤⼀次,但返回兩次。兩次返回的區別是⼦程序的返回值是0,⽽⽗程序的返回 值則是新⼦程序的程序id。
fork之後經常跟隨著exec。作為替代,使⽤了在寫時複製(copy-on-write,cow)的技術。這些區域由⽗、⼦程序共享,⽽且核心將它們的訪問許可權改變為唯讀的。如果有程序試圖修改這些區域,則核心為有關部分,典型的是虛存系統中的「⻚」,做⼀個拷⻉。
#include #include #include int globvar = 6; /* external variable in initialized data */
char buf = "a write to stdout\n";
intmain(void)
else if (pid == 0) else
printf("pid = %ld, glob = %d, var = %d\n", (long)getpid(), globvar, var);
exit(0);
}
vfork
vfork與fork⼀樣都建立⼀個⼦程序, 但是它並不將⽗程序的位址空間完全複製到⼦程序中,因為⼦程序會⽴即調⽤exec(或exit), 也就不會存訪該位址空間。
vfork和fork之間的另⼀個區別是:vfork保證⼦程序先運⾏,在它調⽤exec或exit之後⽗程序才可能被排程運⾏。(如果在調⽤這兩個函式之前⼦程序依賴於⽗程序的進⼀步動作,則會導致死鎖。)
呼叫vfork後,如果子程序修改資料、函式呼叫、或者沒有呼叫exec或exit之後就返回可能會出現未知的錯誤。
測試例子
#include #include #include #include int main(void)
else if(child == 0)
else
return exit_success;
}
總結fork函式生成的子程序會寫時複製的技術對父程序的資料進行複製。父子程序排程根據作業系統的排程來確定。
vfork函式生成的子程序與父程序共享資料。並優先執行。通過 vfork() 建立的子程序會執行完後,才到父程序執行。
參考資料
[1].
[2].
[3].
[4].
fork與vfork的區別
1.fork函式介紹 include sys types.h include unistd.h pid t fork void 正確返回 父程序中返回子程序的程序號 子程序中返回0 單調用雙返回函式 錯誤返回 1 子程序是父程序的乙個拷貝。具體說,子程序從父程序那得到了資料段和堆疊段,但不是與父程序...
fork與vfork的區別
1.vfork保證子程序先執行,在它呼叫exec或exit之後父程序才可能被排程執行。如果在呼叫這兩個函式之前子程序依賴於父程序的進一步動作,則會導致死鎖。2.fork要拷貝父程序的程序環境 而vfork則不需要完全拷貝父程序的程序環境,在子程序沒有呼叫exec和exit之前,子程序與父程序共享程序...
fork與vfork的區別
1.vfork保證子程序先執行,在它呼叫exec或exit之後父程序才可能被排程執行。如果在呼叫這兩個函式之前子程序依賴於父程序的進一步動作,則會導致死鎖。2.fork要拷貝父程序的程序環境 而vfork則不需要完全拷貝父程序的程序環境,在子程序沒有呼叫exec和exit之前,子程序與父程序共享程序...