linux---谈谈vfork和fork的区别及exit与return
fork():创建子进程的函数,是大家比较熟悉的吧。pid_t id = fork();
这里的vfork();也是创建子进程的函数。现在我们来剖析一下它们吧。
第一例:
先看一个fork()的例子哦。
对于fork()而言,创建子进程成功后直接打印出父子进程执行的两条语句。即:
这里要特别强调的是:父子进程的调度的顺序是由调度器决定的。
再看看vfork()函数:
这里有一个重要的函数:exit(1);这也是vfork()中特别重要的一点,如果在子进程中不使用exit(1)会怎么样呢?这意味着父进程永远不会运行。如:
这里的父进程的pid在创建子进程前是多少现在还是多少。即子进程一直在运行。这就是因为没有使用exit(1)的原因。
子进程如果调用了exit(1);说明子进程结束后调用父进程。(这里也说明vfork()的一大特点:先调用子进程,等子进程的exit(1)被调用后,再调用父进程)所以结果如下:
第二例:
看一看它们的地址空间哦:
vfork():
这里看一下他们的地址空间是如何分配的。看看运行的结果:
看的出来,他们的虚拟地址空间是一样的,这一点和fork()函数是一样的。重要的是,当子进程中将g_val的值改变了之后,父进程也随之改变,这一点却是和fork()不一样的,进而引出vfork()函数的另一大特点:在子进程调用exit之前,它在父进程的空间中运行,也就是说会更改父进程的数据段、栈和堆。。
如:
运行结果:
fork()函数:它的虚拟地址是相同的,但是值却不相同,它们所指的物理地址也是不同的。
据上所述,总结一下fork()与vfork()的区别吧~~~:>>
主要为两点:
(1)执行次序:fork():对父子进程的调度室由调度器决定的;
vfork():是先调用子进程,等子进程的exit(1)被调用后,再调用父进程;
(2)对数据段的影响:fork():父子进程不共享一段地址空间,修改子进程,父进程的内容并不会受影响。
vfork():在子进程调用exit之前,它在父进程的空间中运行,也就是说会更改父进程的数据段、 栈和堆。。即共享代码区和数据区,且地址和内容都是一样的。
第三例:
这个例子是关于vfork()创建子进程,且子进程用return返回。
运行结果:
子进程返回时,运行结果是执行后程序一直不断地重复运行,不断创建子进程;
子进程return 1在一个函数中是正常的返回过程,它会使得程序返回到函数被调用处,回复之前的执行流程,又会输出父子进程,所以不像exit一样,直接终止进程。
就先说到这里啦,有什么建议还会做改进哦~~
linux---谈谈vfork和fork的区别及exit与return相关推荐
- 【转】vfork 和 fork的区别
fork()与vfock()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别: 1. fork ():子进程拷贝父进程的数据段,代码段 vfork ( ):子进程与父进程共享数据段 ...
- Linux C 中vfork和fork的区别
我们知道, fork会创建一个新的进程, 这个新的进程是当前进程的子进程, 区别在于, fork函数会复制父进程的一些资源, 也就是, 仅仅是复制的关系, 而非共享. 而vfork就不同了, 利用vf ...
- linux如何在C程序中使用exit,c语言exit和return区别,在fork和vfork中使用
exit函数在头文件stdlib.h中. 简述: exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: return():返回函数,若在main主函数中,则会退出函数并返 ...
- 小何讲进程: Linux进程控制编程 (fork、vfork)
所谓进程控制,就是系统使用一些具有特定功能的程序段来创建进程.撤消进程以及完成进程在各种状态之间的转换, 从而达到多进程高效率并发执行和协调资源共享的目的.进程控制是进程管理和处理机管理的一个重要任务 ...
- c语言exit和return区别,在fork和vfork中使用
转自c语言exit和return区别,在fork和vfork中使用 exit函数在头文件stdlib.h中. 简述: exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: ...
- Linux系统编程(vfork和fork)
文章目录 前言 一.vfork讲解 二.vfork使用 三.exit和_exit 1.exit和_exit对比 2.在vfork中的使用 四.vfork和fork区别 总结 前言 本篇文章讲解vfor ...
- Linux中线程和进程的区别
Linux中线程和进程的区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括 ...
- linux脚本中的exit,Shell中exit和return的区别讲解
1.exit命令 exit命令是Shell内建命令,用于退出当前Shell进程.使用格式如下: exit [] 可以指定退出状态n,n的取值范围是0-255,一般情况下,0表示正常退出,非零表示异常退 ...
- 【Linux系统编程】fork()函数详解
00. 目录 文章目录 00. 目录 01. 进程创建函数 02. 父子进程结构 03. 父子进程地址空间 04. 附录 01. 进程创建函数 #include <sys/types.h> ...
最新文章
- 专访郭霖:成长无止境
- QEMU — I/O 设备操作
- 【RHCA翻译计划】EX436第一章:集群存储概论2
- 趣学python3(25)-del,deepcopy以及内存引用计数
- 深信服安全软件产品配置概况
- javaone_JavaOne 2012:在JVM上诊断应用程序
- Bing与DuckDuckGo搜索结果惊人一致?Google展现强势差异
- c语言bellman算法,求 最短路径中BELLMAN FORD算法实现的C程序
- 一文搞定Redis五大数据类型及使用场景
- 关于浏览器的兼容性问题
- windows下解压xxx.war文件
- f1c100A运行linux,荔枝派 Nano 全志 F1C100s 编译运行 Linux 笔记
- 打开计算机硬盘有声音,电脑硬盘有响声总吱吱响的解决方法
- QQ好友不在线也可发送自定义表情(转)
- php模板开发教程,Destoon模板制作简明教程
- 墨菲定律|马太效应|破窗理论|蝴蝶效应
- c++ 移动桌面图标
- Hive可视化工具squirrel-sql --小松鼠
- XWiKi 部分汉化
- 微信做图小程序有哪些_盘点:微信小程序制作平台有哪些
热门文章
- Access-Ctrol-Allow-Headers:*兼容问题导致的跨域失败
- kotlin访问控制符可见性
- 02-再探MySQL数据库
- 左侧固定,右侧自适应的布局方式(新增评论区大佬教的方法)
- 《Python学习之路 -- 字符串的方法》
- 智能课程表Android版-学年学期星期的实现
- JavaScript 参考教程——写在前面
- Matlab看跌期权二叉树,欧式期权二叉树MATLAB程序
- java gson fromjson,Gson的fromJson()方法
- matlabapp窗口图像_matlab – 如何自定义App Designer图形的背景?