fork函数与vfork函数的使用与区别

进程的创建 fork函数

在Linux环境中,创建进程的主要方法是调用以下两个函数:
#include
#include
pid_t fork(void);
pid_t vfork(void);

创建一个新进程
pid_t fork(void)
功能:
fork()函数用于从一个已存在的进程中创建一个新进程,新进程成为子进程,原进程成为父进程;
返回值:
成功:子进程中返回0,父进程中返回子进程ID。
失败:返回-1。
使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间。
注意:
(1)父子进程是来回交替执行的,谁先执行,谁后执行是不确定的,不要认为父进程执行完之后才执行子进程。
(2)子进程会复制父进程fork之前的所有内容
(3)但是fork之后,父子进程完全独立,所以不管双方怎么改变(堆区、栈区、数据区等),都不会受对方影响。

代码

#include
#include
#include
#include
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
#include
#include
#include
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之后子进程会有自己的进程空间。

你可能感兴趣的:(Linux,linux)