函式fork與vfork的區別與聯絡詳解

2021-05-25 01:23:58 字數 2320 閱讀 3169

建立乙個新程序的方法只有由某個已存在的程序呼叫

fork()

或vfork()

,當然某些程序如

init

等是作為系統啟動的一部

分而被核心建立的。

1.fork函式介紹

#include

#include

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

之後父程序才可能被排程執行。如果在呼叫這兩個函式之前子程序依賴於父程序的進一步動作,則會導致死鎖。

相同:1、兩者被呼叫一次,但是返回兩次。兩次返回的唯一區別是子程序的返回值是

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