1. 程式人生 > >linux——淺談fork與vfork的使用與區別

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() 沒有修改函式棧,不會發生上述的情況,所以,父程序得以順利執行。