fork和vfork有什么区别 简述fork与vfork的区别

描述

fork和vfork有什么区别,作为嵌入式工程师,这个肯定是要掌握的。

不管是fork还是vfork,他们都是为了创建子进程。

函数原型一样,没有参数,但是返回值比较奇怪,别的函数都是只有一个返回值,但是fork和vfork有两个。

 

#include 
#include 


int main()
{
    pid_t pid = fork();
    if (-1 == pid)
    {   
        perror("fork");
        exit(-1);
    }   
    else if (0 == pid)
    {   
        printf("this is child ...
");
    }   
    else 
    {   
        printf("this is parent ...
");
    }


    return 0;
}
就拿fork来说,程序刚运行的时候,只有一个父进程在运行,执行了fork系统调用后,多了一个子进程,你可以理解成有两个人在执行这段代码,父进程的fork返回子进程的ID,子进程的fork返回0,所以代码运行的现象就是fork存在两个返回值,if语句会进入两个分支。

fork和vfork的最大区别就是:fork产生的子进程会复制父进程的地址空间,在内核的进程表中创建一个新的进程表项,新的进程表项有很多属性和原进程一样,像堆栈、数据段、文件描述符这些都会直接从父进程中继承过来,而且两个进程的代码也一样。

要说不一样的地方,比如进程号、父进程号肯定不一样。

那vfork有什么使用场景,如果fork产生子进程后,子进程立马调用exec函数族启动了一个新的进程,那么fork产生的地址空间必将浪费。

于是就有了vfork函数,它最大的特点就是父子进程共享同一块地址空间,这样也不用给子进程分配资源,因为子进程接下来会被一个全新的进程替换。

除了共享资源上的区别,还有一些,比如fork产生的子进程和父进程的运行顺序不一定,由系统决定,但是vfork产生的子进程一定比父进程先运行。

最后,再来看一下vfork的man手册。

PID控制

  它提到了有些人认为vfork是一种架构缺陷,因为fork有了写时拷贝机制,所以在有些场景下使用fork再去通过exec启动新的进程也没问题。 





审核编辑:刘清

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分