fork與vfork的區別

2022-07-21 18:12:14 字數 1754 閱讀 2503

fork與vfork的區別

1.fork函式介紹

#include sys/types.h>

#include unistd.h>

pid_t fork (void );

正確返回:父程序中返回子程序的程序號;子程序中返回0;(單調用雙返回函式)

錯誤返回:-1;

子程序是父程序的乙個拷貝。具體說,子程序從父程序那得到了資料段和堆疊段,但不是與父程序共享而是單獨分配記憶體。fork函式返回後,子程序和父程序都是從fork函式的下一條語句開始執行。由於子程序與父程序的執行是無關的,父程序可先於子程序執行,子程序也可先於父程序執行,所以下段程式可以有兩種執行結果。

#include stdio.h>

#include sys/types.h>

#include unistd.h>

int globa = 4;

int main (void )

else if (pid == 0)

else

printf("parent did not changde\n");

printf("globa = %d vari = %d\n",globa,vari);

exit(0);

}執行結果:(可能出現的一種結果) 

before fork

child changed

globa = 5 vari = 4

parent did not changde

globa = 4 vari = 5

2.vfork函式介紹

vfork建立新程序的主要目的在於用exec函式執行另外的程式,實際上,在沒呼叫exec或exit之前子程序的執行中是與父程序共享資料段的。在vfork呼叫中,子程序先執行,父程序掛起,直到子程序呼叫exec或exit,在這以後,父子程序的執行順序不再有限制。

#include stdio.h>

#include sys/types.h>

#include unistd.h>

int globa = 4;

int main (void )

else if (pid == 0)

else

printf("parent did not changde\n");

printf("globa = %d vari = %d\n",globa,vari);

exit(0);

}執行結果(固定的):

child changed

parent did not changde

globa = 5 vari = 4

區別:1、fork()用於建立乙個新程序。由fork()建立的子程序是父程序的副本。即子程序獲取父程序資料空間,堆和 棧的副本。父子程序之間不共享這些儲存空間的部分。而vfork()建立的程序並不將父程序的位址空間完全複製到子程序中,因為子程序會立即呼叫exec (或exit)於是也就不會存放該位址空間。相反,在子程序呼叫exec或exit之前,它在父程序的空間進行。

2、vfork()與fork()另乙個區別就是:vfork保證子程序先執行,在呼叫exec或exit之前與父程序資料是共享的,在它呼叫exec或exit之後父程序才可能被排程執行。

3、vfork和fork之間的還有乙個區別是: vfork保證子程序先執行,在她呼叫exec或exit之後父程序才可能被排程執行。如果在呼叫這兩個函式之前子程序依賴於父程序的進一步動作,則會導致死鎖。

相同:兩者被呼叫一次,但是返回兩次。兩次返回的唯一區別是子程序的返回值是0,而父程序的返回值則是新子程序的程序id。

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