fork函式與vfork函式的使用與區別
阿新 • • 發佈:2020-12-21
技術標籤:linux
程序的建立 fork函式
在Linux環境中,建立程序的主要方法是呼叫以下兩個函式:
#include<sys/types.h>
#include<unistd.h>
pid_t fork(void);
pid_t vfork(void);
建立一個新程序
pid_t fork(void)
功能:
fork()函式用於從一個已存在的程序中建立一個新程序,新程序成為子程序,原程序成為父程序;
返回值:
成功:子程序中返回0,父程序中返回子程序ID。
失敗:返回-1。
使用fork函式得到的子程序是父程序的一個複製品,它從父程序處繼承了整個程序的地址空間。
(1)父子程序是來回交替執行的,誰先執行,誰後執行是不確定的,不要認為父程序執行完之後才執行子程序。
(2)子程序會複製父程序fork之前的所有內容
(3)但是fork之後,父子程序完全獨立,所以不管雙方怎麼改變(堆區、棧區、資料區等),都不會受對方影響。
程式碼
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
int a = 10;
int main()
{
pid_t pid;
int b =9;
//使用fork建立完子程序
pid = fork();
if(pid < 0)
{
perror("fail to vfork\n");
exit(1);
}
else if(pid == 0)
{
a++;
b++;
printf("in son process a = %d,b = %d\n",a,b);
exit (0);
}
else
{
a--;
b--;
printf("in father process a = %d,b = %d\n",a,b);
exit(0);
}
return 0;
}
執行結果:
程序的建立 vfork函式
pid_t vfork(void)
功能:
vfork函式和fork函式一樣都是在已有的程序中建立一個新的程序,但它們建立的子程序是有區別的。
返回值:
建立子程序成功,則在子程序中返回0,父程序中返回子程序ID,出錯則返回-1。
例:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
int a = 10;
int main()
{
pid_t pid;
int b =9;
//使用vfork建立完子程序
//在子程序執行exit或者exec之前,父子程序共用同一塊地址空間
pid = vfork();
if(pid < 0)
{
perror("fail to vfork\n");
exit(1);
}
else if(pid == 0)
{
a++;
b++;
printf("in son process a = %d,b = %d\n",a,b);
exit(0);
}
else
{
printf("in father process a = %d,b = %d\n",a,b);
exit(0);
}
return 0;
}
執行結果:
此時說明在子程序執行exit或者exec之前,父子程序共用同一塊地址空間
fork和vfork函式的區別:
vfork保證子程序先執行,在他呼叫exec或exit之後,父程序才可能被排程執行。
vfork和fork一樣都建立一個子程序,但他不將父程序的地址空間完全複製到子程序中,因為子程序會立即呼叫exec或exit,於是也就不訪問該地址空間。
相反,在子程序中呼叫exec或exit之前,它在父程序的地址空間中執行,在exec之後子程序會有自己的程序空間。