fork和vfork有什么区别,作为嵌入式工程师,这个肯定是要掌握的。
不管是fork还是vfork,他们都是为了创建子进程。
函数原型一样,没有参数,但是返回值比较奇怪,别的函数都是只有一个返回值,但是fork和vfork有两个。
#include就拿fork来说,程序刚运行的时候,只有一个父进程在运行,执行了fork系统调用后,多了一个子进程,你可以理解成有两个人在执行这段代码,父进程的fork返回子进程的ID,子进程的fork返回0,所以代码运行的现象就是fork存在两个返回值,if语句会进入两个分支。#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和vfork的最大区别就是:fork产生的子进程会复制父进程的地址空间,在内核的进程表中创建一个新的进程表项,新的进程表项有很多属性和原进程一样,像堆栈、数据段、文件描述符这些都会直接从父进程中继承过来,而且两个进程的代码也一样。
要说不一样的地方,比如进程号、父进程号肯定不一样。
那vfork有什么使用场景,如果fork产生子进程后,子进程立马调用exec函数族启动了一个新的进程,那么fork产生的地址空间必将浪费。
于是就有了vfork函数,它最大的特点就是父子进程共享同一块地址空间,这样也不用给子进程分配资源,因为子进程接下来会被一个全新的进程替换。
除了共享资源上的区别,还有一些,比如fork产生的子进程和父进程的运行顺序不一定,由系统决定,但是vfork产生的子进程一定比父进程先运行。
最后,再来看一下vfork的man手册。
它提到了有些人认为vfork是一种架构缺陷,因为fork有了写时拷贝机制,所以在有些场景下使用fork再去通过exec启动新的进程也没问题。
审核编辑:刘清
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
PID控制
+关注
关注
10文章
460浏览量
40093 -
printf函数
+关注
关注
0文章
31浏览量
5892 -
PID技术
+关注
关注
0文章
4浏览量
1968
原文标题:fork和vfork的区别
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
Linux下多进程编程之fork()函数语法
,因此执行速度是比较慢的。为了加快fork()的执行速度,很多UNIX系统设计者创建了vfork()。vfork()也能创建新进程,但它不产生父进程的副本。它是通过允许父子进程可访问相同物理内存,从而伪装
发表于 08-19 09:28
最常见的fork用法是什么
接口语法用来创造一个子进程在子进程中,成功的fork调用会返回 0。在父进程中fork返回子进程的 pid。如果出现错误,fork返回一个负值成功调用fork会创建一个新的进程,它几乎
发表于 12-15 07:38
hpmicro fork出来的riscv-gnu-toolchain与上游有什么区别?
找遍官网没找到先关信息。有几个疑问
hpmicro fork出来的riscv-gnu-toolchain 与上游有何区别?
看到william hill官网
里有文
发表于 05-26 07:13
Linux系统的fork运行机制分析
如果其中一个进程的输出结果是“pid1:1001, pid2:1002”,写出其他进程的输出结果(不考虑进程执行顺序)。
明显这道题的目的是考察linux下fork的执行机制。下面我们通过分析这个题目,谈谈Linux下fork的运行机制。
发表于 04-26 16:26
•1164次阅读
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,接着选择
神奇的vfork
?什么是vfork,网络上介绍它的文档很多,随便一搜就是一大堆。简单来说,vfork和fork完成了基本上相同的功能,把进程做了一次复制,变成两个进程。在shell中,执行命令时,shell程序就是通过“复制
发表于 04-02 14:42
•308次阅读
fork函数的作用_fork函数创建进程
在Linux中fork函数是非常重要的函数,它的作用是从已经存在的进程中创建一个子进程,而原进程称为父进程。
发表于 12-01 13:41
•7908次阅读
SystemVerilog中的fork-join_any
fork-join_any和fork-join有所不同,fork-join_any的父进程一直阻塞,直到任何一个并行的子进程结束。
SystemVerilog中的fork-join
在fork-join语句块中,每个语句都是并发进程。在这个语句块中,父进程一直被阻塞,直到所有由“fork-join”产生的子进程都执行完。
SystemVerilog中的fork-join_none
fork-join_none和fork-join、fork-join_any的区别一样在于进程退出机制以及对于父进程的影响。
评论