上文,簡單得介紹了fork。這裏,我們來說一下vfork
fork和vfork的區別
1. 內存空間
fork (): 子進程拷貝父進程的數據段,代碼段
vfork(): 子進程與父進程共享數據段
2. 執行次序
fork (): 父/子進程的執行次序不確定
vfork(): 子進程先運行,在調用exec 或exit 之前與父進程數據是共享的, 子進程調用exec
或exit 之後,父進程纔可能被調度運行。如果在調用這兩個函數之前子進程依賴於父進程的進一步動作,則會導致死鎖。
#include <stdlib.h>
#include <sys/types.h>
#include <sys/time.h>
int main()
{
int a = 1;
pid_t pid;
pid = vfork();
if (pid == 0) {
/* child task */
a++;
printf("Hello, child: a=%d\n", a);
sleep(5);
exit(0);
} else {
/* parent task */
sleep(3);
printf("Hello, parent: a=%d\n", a);
}
return 0;
}