linux——淺談fork與vfork的使用與區別
程序建立—fork
#include<unistd.h>
pid_t fork(void)
功能:建立子程序
fork的奇妙之處在於它被呼叫一次 ,卻返回兩次,它可能有三種不同的返回值
1. 在父程序中,fork返回新建立的子程序的PID。
2. 在子程序中,fork返回0;
3. 如果出現錯誤,fork返回一個負值。
例:fork.c
#include #incluede main() { pid_t pid;//此時僅有一個程序 pid=fork();//此時已經有兩個程序在同時執行 if(pid<0) printf("error in fork!"); else if(pid==0) printf("'I am the child process,ID is %d\n",getpid()); else printf("'I am the parent process,ID is %d\n",getpid()); }
執行結果:
分析原因:
在pid=fork()之前,只有一個程序在執行,但在這條語句執行之後,就變成兩個程序在執行了,這兩個程序的共享程式碼段,將要執行的下一條語句都是if(pid==0)。兩個程序中,原來存在的那個程序被稱作“父程序“,新出現的那個程序被稱作“子程序”,父子程序的區別在於程序識別符號(PID)不同。
程序建立——思考執行結果
#include
#include
int main(void)
{
pid_t pid;
int count=0;
pid=fork;
count++;
printf("count=%d\n",count);
return 0;
}
執行結果:
分析原因:
子程序的資料空間,堆疊空間都會從父程序得到一個拷貝,而不是共享。在子程序中對count進行加1的操作,並沒有影響到父程序的count值,父程序中的count值仍然是0。
程序建立—vfork
#include<sys/types.h>
#include<unistd.h>
pid_t vfork(void)
功能:建立子程序
fork vs vfork
區別:1.fork:子程序拷貝父程序的資料段
vfork:子程序與父程序共享資料段
2.fork:父,子程序的執行次序不確定
vfork:子程序先執行,父程序後執行
例項分析:
#include #include int main(void) { pid_t pid; int count=0; pid=vfork(); count++; printf("count=%d\n",count); return 0; }
執行結果:
從上圖發現我們執行到最後程式掛掉,對此,我找了下vfork的用法,才發現子程序一般要呼叫exec或exit函式。對此我在這段程式中修改了一個地方,(將return改為exit)為什麼掛掉了呢?(好奇怪呀!!!)
執行結果:
分析下原因:原來main()函式return後,程式的函式棧發生了變化,而main()函式return後,通常會呼叫 exit()或相似的函式,這時,父程序收到子程序exit(),開始從vfork返回,但是父程序棧都被子程序給return幹廢掉了,總之就是子程序呼叫exit() 沒有修改函式棧,不會發生上述的情況,所以,父程序得以順利執行。