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相关推荐

  1. 【转】vfork 和 fork的区别

    fork()与vfock()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别: 1.  fork  ():子进程拷贝父进程的数据段,代码段     vfork ( ):子进程与父进程共享数据段 ...

  2. Linux C 中vfork和fork的区别

    我们知道, fork会创建一个新的进程, 这个新的进程是当前进程的子进程, 区别在于, fork函数会复制父进程的一些资源, 也就是, 仅仅是复制的关系, 而非共享. 而vfork就不同了, 利用vf ...

  3. linux如何在C程序中使用exit,c语言exit和return区别,在fork和vfork中使用

    exit函数在头文件stdlib.h中. 简述: exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: return():返回函数,若在main主函数中,则会退出函数并返 ...

  4. 小何讲进程: Linux进程控制编程 (fork、vfork)

    所谓进程控制,就是系统使用一些具有特定功能的程序段来创建进程.撤消进程以及完成进程在各种状态之间的转换, 从而达到多进程高效率并发执行和协调资源共享的目的.进程控制是进程管理和处理机管理的一个重要任务 ...

  5. c语言exit和return区别,在fork和vfork中使用

    转自c语言exit和return区别,在fork和vfork中使用 exit函数在头文件stdlib.h中. 简述: exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: ...

  6. Linux系统编程(vfork和fork)

    文章目录 前言 一.vfork讲解 二.vfork使用 三.exit和_exit 1.exit和_exit对比 2.在vfork中的使用 四.vfork和fork区别 总结 前言 本篇文章讲解vfor ...

  7. Linux中线程和进程的区别

    Linux中线程和进程的区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括 ...

  8. linux脚本中的exit,Shell中exit和return的区别讲解

    1.exit命令 exit命令是Shell内建命令,用于退出当前Shell进程.使用格式如下: exit [] 可以指定退出状态n,n的取值范围是0-255,一般情况下,0表示正常退出,非零表示异常退 ...

  9. 【Linux系统编程】fork()函数详解

    00. 目录 文章目录 00. 目录 01. 进程创建函数 02. 父子进程结构 03. 父子进程地址空间 04. 附录 01. 进程创建函数 #include <sys/types.h> ...

最新文章

  1. 算法-----------接雨水(Java版本)
  2. linux 开发组织模式,Linux内核发布模式与开发组织模式(1)
  3. python3(二)Numpy
  4. 参加动画电影《魔比斯环》首映
  5. python选取特定行_pandas.DataFrame选取/排除特定行的方法
  6. python FastDFS
  7. 评分卡模型开发(五)--定性指标筛选
  8. 从Java看数据结构之——树和他的操作集
  9. 联想Win7 SP1 32位/64位OEM系统[官方原版]
  10. NOIP2017小凯的疑惑
  11. 读李虹之《画法几何及机械制图》
  12. HTML+CSS大作业——水果介绍-橙子之家(6页) HTML+CSS+JavaScript 学生dreamweaver网页设计作业成品
  13. Semantic Parsing on Freebase from Question-Answer Pairs【论文笔记】
  14. python pack和unpack
  15. 《国际贸易术语解释通则》概述中关于2000年通则的主要内容
  16. lm2576使用注意
  17. 飞行摇杆设置_分离摇杆+16000DPI,旗舰电竞鼠标ROG魔刃标准版体验
  18. 峰回路转,幽辉半床——新说莺莺传之四
  19. java使用selenium实现模拟浏览器操作API大全 模拟登录
  20. 金蝶云星空与钉钉集成案例

热门文章

  1. json - json对象和json字符串直接的相互转换
  2. bzoj4709 [Jsoi2011]柠檬
  3. Spring注入方式及注解配置
  4. node--更新数据库问题
  5. 小心pthread_cond_signal和SetEvent之间的差异
  6. linux修改组的选项名字为,Linux用户、组及权限管理浅析
  7. linux mysql 5.6.23_MySQL 5.6.23升级到MySQL 5.7.9
  8. 关闭运动轨迹_网球初学者如何正确入门网球运动,有哪些学习细节
  9. 家用计算机历史记录,教您如何查看电脑使用记录
  10. java 自定义对象 排序,使用自定义排序顺序对对象的ArrayList进行排序