fork 與vfork 的異同

2021-10-05 20:44:49 字數 1292 閱讀 4136

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之前,子程序與父程序共享程序...