0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

学益得智能硬件 来源:学益得智能硬件 2023-08-03 17:12 次阅读

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手册。

07b28cec-31dd-11ee-9e74-dac502259ad0.png

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





审核编辑:刘清

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

    关注

    10

    文章

    442

    浏览量

    39703
  • printf函数
    +关注

    关注

    0

    文章

    30

    浏览量

    5826
  • PID技术
    +关注

    关注

    0

    文章

    4

    浏览量

    1954

原文标题:fork和vfork的区别

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux下多进程编程之fork()函数语法

    ,因此执行速度是比较慢的。为了加快fork()的执行速度,很多UNIX系统设计者创建了vfork()。vfork()也能创建新进程,但它不产生父进程的副本。它是通过允许父子进程可访问相同物理内存,从而伪装
    发表于 08-19 09:28

    Linux中fork()函数详解

    的事。一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。。。。。。需要的请下载附件PDF。
    发表于 11-12 13:37

    begin ...... end 与 fork ...... join 语句的 区别 ------ 转载

    的执行时间为5d。 (2)fork……join,用来组合需要并行执行的语句,被称为并行块。例如:parameter d = 50; reg[7:0] r; fork //由一系列延迟产生的波形 # d r
    发表于 06-02 21:31

    最常见的fork用法是什么

    接口语法用来创造一个子进程在子进程中,成功的fork调用会返回 0。在父进程中fork返回子进程的 pid。如果出现错误,fork返回一个负值成功调用fork会创建一个新的进程,它几乎
    发表于 12-15 07:38

    hpmicro fork出来的riscv-gnu-toolchain与上游什么区别

    找遍官网没找到先关信息。几个疑问 hpmicro fork出来的riscv-gnu-toolchain 与上游区别? 看到论坛里
    发表于 05-26 07:13

    Fork/Join框架的软件重构及性能分析

    针对目前对于Fork/Join框架应用和性能分析的相关工作还不多的现状,以JGF基准测试程序套件为基础,对其中的senes、crypt、sparsematmult和sor等程序使用Fork/Join
    发表于 12-29 10:06 0次下载

    如何在GitHub上更新Fork以及PullRequest给源项目

    这里有个小技巧:在默认状态下,会是Base源项目,Head我自己的Fork项目;这样选择任何一个时,会调到某个无法更新的页面;解决方法是先Base或Head一个其他人的账号下的Fork,接着选择
    的头像 发表于 01-08 09:38 4146次阅读
    如何在GitHub上更新<b class='flag-5'>Fork</b>以及PullRequest给源项目

    神奇的vfork

    ?什么是vfork,网络上介绍它的文档很多,随便一搜就是一大堆。简单来说,vforkfork完成了基本上相同的功能,把进程做了一次复制,变成两个进程。在shell中,执行命令时,shell程序就是通过“复制
    发表于 04-02 14:42 290次阅读

    fork函数的作用_fork函数创建进程

     在Linux中fork函数是非常重要的函数,它的作用是从已经存在的进程中创建一个子进程,而原进程称为父进程。
    发表于 12-01 13:41 7434次阅读
    <b class='flag-5'>fork</b>函数的作用_<b class='flag-5'>fork</b>函数创建进程

    基于Fork的功能性支架

    电子发烧友网站提供《基于Fork的功能性支架.zip》资料免费下载
    发表于 11-18 12:09 0次下载
    基于<b class='flag-5'>Fork</b>的功能性支架

    SystemVerilog中的fork-join_any

    fork-join_any和fork-join有所不同,fork-join_any的父进程一直阻塞,直到任何一个并行的子进程结束。
    的头像 发表于 12-09 09:05 1437次阅读

    SystemVerilog中的fork-join

    fork-join语句块中,每个语句都是并发进程。在这个语句块中,父进程一直被阻塞,直到所有由“fork-join”产生的子进程都执行完。
    的头像 发表于 12-09 11:58 1589次阅读

    SystemVerilog中的fork-join_none

    fork-join_none和fork-join、fork-join_any的区别一样在于进程退出机制以及对于父进程的影响。
    的头像 发表于 12-12 10:00 1923次阅读

    Linux中可怕的fork炸弹介绍

    Linux中的Fork炸弹(Fork Bomb)是一种拒绝服务攻击的形式,它利用了操作系统中的“fork()”系统调用。
    的头像 发表于 05-22 10:46 2021次阅读
    Linux中可怕的<b class='flag-5'>fork</b>炸弹介绍

    fork()函数详解

    pid_t fork(void);//pid_t为int类型,进行了重载
    的头像 发表于 08-15 09:41 780次阅读
    <b class='flag-5'>fork</b>()函数详解