1. 程式人生 > 其它 >fork函式與vfork函式的使用與區別

fork函式與vfork函式的使用與區別

技術標籤: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之後子程序會有自己的程序空間。