建立乙個新程序的方法只有由某個已存在的程序呼叫
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之前,子程序與父程序共享程序...