fork与vfork浅析

fork和vfork的区别 概述 fork和vfork都是用来创建一个子进程的。 阅读详情

在Unix编程时,学习到了进程的建立的函数fork()与vfork()这两个函数,所以做了一个总结:

1.fork()函数

      创建子进程,创建的子进程与父进程共享代码段,但不共享数据段;在调用fork()函数后父子进程的运行顺序不定,一个运行另个阻塞。其返回值有3种:

    a.创建出错返回-1;

    b.创建正确,在子进程中返回0;在父进程中返回该子进程的PID。

代码如下所示:

        

运行结果如下:

             

由程序和运行结果可得出如下结论:

    a.由上图蓝框可知,打印的顺序不定,即在调用fork()函数后父子进程的运行顺序不定;

    b.由a的值(红线部分)可知,父子进程共享代码段,但并没有共享数据段;

   c..由上图黄色部分可知,在父进程中pid=fork()函数返回值为子进程的PID,而子进程中的pid值为0;

    d.细心的话,可发现子进程的PID一直大于父进程的PID,原因是什么呢,原因在与在调用fork()函数之前父进程   的PID已经存在,即父进程先于子进程创建,因此PID小于子进程。

2. vfork()函数

      个人认为vfork()这个函数比较难理解。vfork()函数也是创建子进程,其主要目的是在于用exec函数执行另外的程序,在调用exec或exit之前子进程的运行中是与父进程共享数据段,但如果子进程修改了数据,而又没有调用exec或exit,其结果是很糟糕的例如下面的代码:  

           

其运行结果如下:

          

由程序和运行结果可得出如下结论:

    a. 由绿色的方框可知,子进程与父进程是即共享代码段也共享数据段的

    b. 由红色的圆框可知,在vfork()函数调用后,是先运行子进程后运行父进程

    c. 由蓝色的线可知,vfork()函数返回的值,子进程为0,父进程为子进程的PID

倘若去掉子进程中的exit(0)(程序14行),会是什么样的一个结果呢?如下:

          


由程序和运行结果可得出如下结论:(程序一直运行直到子进程pid溢出才停止,即vfork()返回值pid=-1)

    a. 由蓝线可知vfork()函数返回的值,子进程为0,父进程为子进程的PID

    b. 由红框可知,在改程序运行时,由于整个进程一直在运行所以父进程的PID保持不变。

    c. 由紫色框可知,a的值无论在父进程还是子进程,其值都是不变的,

    d. 现在解释一下,为什么程序最后vfork()函数会返回-1,其实是这个过程中是不断的创建子进程的,所以子进程的pid一直在变化,直到所有的pid被用完,才停止程序,是不是很有意思呢。



百度api爬虫(1)从百度api中爬取地点数据 几句废话———— 百度api就是基于百度地图的开发接口,这么大的地图公司居然给开发接口真的很感激哎! 所以,言归正传。现在项目需求要把乌鲁木齐市内的所有清真寺都用矢量圈出来,然后做点统计啥的,最后做个专题图产品。 怎么把清真寺找出来? 领导的意思是你一个一个上网搜吧,这就是你的工作量。那我当然要想办法啊,边工作边学习工作才有意义嘛! 然后就发现百度api可以实现我的需求。其实可以通过py... 阅读详情

相关推荐

WINCC8.1工业组态软件安装与授权配置指南

SCADA系统作为工业自动化控制的核心平台,通过实时数据采集与监控实现生产流程可视化。WINCC作为西门子旗舰级组态软件,其8.1版本凭借稳定的运行时环境在汽车制造、流程工业等领域广泛应用。本文从工业控制系统软件安装规范切入,重点解析WINCC8.1与Automation License Manager的协同工作原理,详细说明包括系统环境检查、安装包校验、授权文件配置等关键技术环节。针对工程实施中常见的内存配置不足、授权管理器报错等典型问题,提供经过现场验证的解决方案,特别适用于需要进行产线监控系统升级维护

cqwf95925的博客 1657

exit(0)与exit(1)、return区别

exit(0):正常运行程序并退出程序; exit(1):非正常运行导致退出程序; return():返回函数,若在主函数中,则会退出函数并返回一值。 详细说:   1. return返回函数值,是关键字;  exit 是一个函数。   2. return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。   3. return是函数的退出(返回)

非同╰_╯寻常 1059

思科网络进阶——多生成树协议(MSTP)配置的一课一得

三、实验拓扑1)设计一个网络架构,要有核心层和接入层,都使用思科交换机。2)企业有4个部门,要求这四个部门都可以上网,但分属不同的VLAN中,这样今后可以做其它安全策略以确保网络安全,这些策略如今后学到的访问控制列表ACL。3)网络架构的设计要具有冗余,防止一条线路或一台设备终端导致的业务中断。4)由于硬件冗余而产生的环路要处理好,也就是要在逻辑上(或者说通过配置)防止物理环路的产生。5)不能因为防止物理环路而导致某端口没有流量,这样浪费端口资源及设备间互联的带宽资源。

zhu52010的博客 3400

fork/vfork详解

getpid 获取当前进程id getppid 获取当前进程的父进程的id pid_t fork() 1.为什么fork有两个返回值? 因为这两个返回值是由不同的进程return出来的,而不是由一个fork函数返回两个数。 (fork后,进程由一个变成两个,两个进程分别有一个返回值) 返回值: <0:失败 &

JaweG 3991

原生H5如何优雅拦截浏览器返回事件:全面屏侧滑退出的解决方案

本文深入探讨了在原生H5中如何优雅地处理浏览器返回事件,特别是针对全面屏手机侧滑返回手势的解决方案。核心是利用HTML5 History API,通过`history.pushState`方法在历史栈中插入记录,并监听`popstate`事件,从而实现在用户侧滑时平滑关闭全屏预览层而非直接退出页面,有效提升了移动端H5应用的原生交互体验。

i0j1k2l3m的博客 270

Chapter 4 Ripple-Based Control Technique Part I

本文介绍了DC-DC转换器的纹波控制技术,重点分析了迟滞控制、恒定开通时间控制、恒定关断时间控制等方案的工作原理及优缺点。纹波控制无需补偿网络,具有快速瞬态响应和结构简单的优势,特别适合电池供电应用。其中,恒定开通时间控制在轻载时能自动延长关断时间,实现伪定频工作;而恒定关断时间控制轻载效率较低。文章还讨论了纹波注入技术解决Boost转换器右半平面零点问题,并比较了不同控制方案在负载瞬态下的性能表现。最后指出基于纹波的控制技术在提高调节精度和降低EMI方面的改进方向。

2304_76736886的博客 1303

【fork与vfork的区别】

fork与vfork的区别

weixin_56223966的博客 3979

告别卡顿!手把手教你用北鲲云超算平台图形化提交COMSOL仿真任务(附RDP连接技巧)

本文详细介绍了如何利用北鲲云超算平台图形化提交COMSOL仿真任务,解决本地计算资源不足导致的卡顿问题。通过云端高性能计算,用户可轻松配置多核CPU和大内存资源,实现高效仿真计算,并附有RDP连接优化技巧,提升远程操作体验。

weixin_42519781的博客 382

fork函数与vfork函数

status:函数返回时,参数status中包含子进程退出时的状态信息,子进程的退出信息在一个int中包含了多个字段,用宏定义可以取出其中的每个字段。当pid所指示的子进程不存在,或此进程存在,但不是调用进程的子进程,waitpid就会出错返回,这时errno被设置为ECHILD。使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,父子进程是独立的。子进程已运行结束,父进程未调用wait或者waitpid函数回收子进程的资源是子进程变为僵尸进程的原因。

2401_83430041的博客 1913

一文搞懂雷达脉冲压缩和匹配滤波器

为了解决传统单频脉冲雷达面临的作用距离和空间分辨力之间的矛盾,脉冲压缩理论被提出。在接收端设计一个和发射信号能够“共轭匹配”的网络来实现脉冲压缩。接收到的回波信号通过匹配滤波器时,滤波器的增益在信号越强的频率点越大;在信号越弱的频率点,增益越小,通过这样的方式使信号在时域更加集中。脉冲压缩技术大致可分为线性调频(LFM)和相位编码。其中LFM信号易于通过硬件或各种技术产生,但是进行匹配滤波后主旁瓣比高达13.2dB,在检测多个目标时,强目标的回波旁瓣可能会把弱小信号覆盖,导致弱小信号的检测受到影响。

FPGA入门到跑路 9939

ZYNQ PL通过EMIO ETHE1外接PHY由GMII转RGMII

1,设置EMIO方式引出ETHE1 2,从GMII过度到RGMII GMII: 发送 gmii_tx_clk gmii_tx_d[7:0] gmii_tx_en gmii_tx_er 接收 gmii_rx_clk gmii_rx_d[7:0] gmii_rx_dv gmii_rx_er RGMII: 发送 tx_clk tx_d[3:0] tx_ctrl 接收 rx_clk rx_d[3:0] rx_ctrl 首先数据总线从时钟单边沿采样8bit转变为了双边沿采样4bit,从88E1

wangjie36的博客 1万+

【Linux】fork与vfork函数的联系与区别(浅析)

文章目录@[toc]1、fork函数2、vfork函数3、fork和vfork的区别 1、fork函数 pid_t fork(void); 功能:创建一个新进程。(子进程会拷贝父进程的PCB) 返回值:一次调用两次返回,子进程返回0,父进程返回子进程ID,出错返回-1。   1、两次返回分别是进程ID和0,父进程会拿到子进程的ID作为返回值,子进程返回0,借此可以分别出父子进程,编写不同的处理分支。   2、通过fork创建的子进程就是父进程的副本(拷贝),子进程会获取父进程数据段、bss段、堆、

Sunnyside_ 1102

YOLOv8多传感器融合技术——摄像头阵列融合技术详解

本文详细介绍了基于YOLOv8的摄像头阵列融合技术,该技术通过多摄像头协同工作实现360度无死角环境感知。文章阐述了系统原理,包括全方位视野覆盖、冗余设计和深度感知等优势,并提供了完整的Python实现代码。关键技术涵盖多摄像头检测、立体匹配、3D投影和目标融合等模块,支持时间域融合提升稳定性。该系统可显著提高自动驾驶的环境感知能力,减少检测盲区,增强系统可靠性,是L4-L5级自动驾驶的关键技术之一。文章还展示了城市驾驶场景的实际应用,验证了该技术对复杂交通环境的适应能力。

u010117029的博客 214

浅析linux中的fork、vfork和clone

     各种大神的混合,做个笔记。                 http://blog.sina.com.cn/s/blog_7598036901019fcg.html                           http://blog.youkuaiyun.com/kennyrose/article/details/7532912                            h...

weixin_33782386的博客 222

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【Linux】fork函数详解以及与vfork的区别

fork()函数是用来通过一个现有的进程创建一个新进程。 一、简述fork()函数 1、函数原型:pid_t fork(void); 2、返回值:0 返回到子进程中 >0 给父进程返回新子进程的进程ID; -1 出错 3、两个问题:为什么子进程中返回0?为什么要向父进程中返回新子进程的进程ID? ...

IT_Mitchell的博客 614

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

浅析UNIX下系统调用fork()函数

- 介绍 fork()系统调用用于创建一个新进程,称为子进程,他与进程(成为系统调用fork的进程)同时运行,此进程称为父进程。创建新的子进程后,两个进程将执行fork()系统调用之后的下一条指令。子进程使用相同得pc(程序计数器),相同的CPU寄存器,在父进程中使用的相同打开文件。其返回值如下:   1. 负值:创建子进程失败。   2. 零:返回到新创建的子进程。   3. 正值:返回父进程...

weixin_42647166的博客 1463

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

linux 的fork函数原型,浅析fork()和底层实现

记得以前初次接触fork()函数的时候,一直被“printf”输出多少次的问题弄得比较晕乎。不过,“黄天不负留心人"。哈~ 终于在学习进程和进程创建fork相关知识后,总算是大致摸清了其中的来龙去脉。废话不多讲,下面来谈谈本人的一点小小积累一个现有的进程可以调用fork函数创建一个新进程。原型如下:#includepid_t fork(void);返回值:自进程中返回0,父进程返回进程id,出错返...

weixin_33819646的博客 423

嵌入式软件开发之------浅析 fork()函数(十二)

linux代码版本:linux4.4 glibc代码版本:glibc-2.26 导读:在linux内核态也搞了好几年了,公司的新平台也都转向了用户态,发展趋势也是linux的工作量也来越少,更多的工作也将聚焦在业务上。其实无论是在内核态还是用户态编程,对于嵌入式编程来说,没有本质区别,嵌入式产品上也不太会去做数据库等之类的应用,大多还是基于设备文件操作、进程通信、socket等实现业务逻辑。在...

lujian186的博客 894

转:浅析fork()和底层实现

浅析fork()和底层实现 阅读目录 fork()运行时做的事情 父子进程文件共享问题 fork()函数在底层中做了什么? vfork和fork的之间的比较: 记得以前初次接触fork()函数的时候,一直被“printf”输出多少次的问题弄得比较晕乎。不过,“黄天不负留心人"。哈~ 终于在学习进程和进程创建fork相关知识后,总算是大致摸清了其中的来龙去脉。废话不多讲,下面来谈谈本人...

hunter 180

浅析fork()和底层实现

阅读目录 fork()运行时做的事情 父子进程文件共享问题 fork()函数在底层中做了什么? vfork和fork的之间的比较: 记得以前初次接触fork()函数的时候,一直被“printf”输出多少次的问题弄得比较晕乎。不过,“黄天不负留心人"。哈~ 终于在学习进程和进程创建fork相关知识后,总算是大致摸清了其中的来龙去脉。废话不多讲,下面来谈谈本人的一点小小积累 一个现有...

Y_Hanxiao的博客 331

浅析linux中fork函数

作者:吴新武,华清远见嵌入式学院讲师。 Linux通过clone()系统调用实现fork()、vfork()和__clone()库函数创建新的进程,这个调用通过一系列的参数标志来指明父子进程的共享资源,最终将各自的参数标志位传递给clone,由clone()去调用do_fork()来实现创建新的进程的目的。 do_fork的实现源码在kernel/fork.c文件中,其主要的作用就是复

ruglcc's blog 1102

Linux多进程拷贝fork,浅析linux中fork函数

Linux通过clone()系统调用实现fork()、vfork()和__clone()库函数创建新的进程,这个调用通过一系列的参数标志来指明父子进程的共享资源,终将各自的参数标志位传递给clone,由clone()去调用do_fork()来实现创建新的进程的目的。do_fork的实现源码在kernel/fork.c文件中,其主要的作用就是复制原来的进程成为另一个新的进程,它完成了整个进程的创建过...

weixin_30834169的博客 424

进程生命周期浅析

进程生命周期浅析 一、前言 本章节讲述内核对于进程的实现,包括进程的创建、状态变更和进程的销毁。对于进程的运行(即调度),已在其他章节中分析,这里不再进行赘述。 二、进程创建 内核中与进程创建相关的系统调用包括fork、vfork、clone、unshare、exec等。 fork:该系统调用没有参数,其创建个子进程,并采用写时复制技术,拷贝一份父进程的页表并标记为只读,当尝试对页表里的页进行写入时,将会触发拷贝动作(如果该页的使用数为1,则说明只有一个进程在使用,直接将其设置为可写)。 vfork:与f

qq_17045267的博客 500

Linux内核 do_fork 函数源代码浅析

在 Linux 内核中,供用户创建进程的系统调用fork()函数的响应函数是 sys_fork()、sys_clone()、sys_vfork()。这三个函数都是通过调用内核函数 do_fork() 来实现的。根据调用时所使用的 clone_flags 参数不同,do_fork() 函数完成的工作也各异。       这部分内容简单,我不打算就此而展开分析。下面我们重点来讲解以下 do_fork

MyArrow的专栏 3758
上一篇: apue《UNIX环境高级编程第三版》第一章答案详解
下一篇: 线程编程之浅尝辄止1
葫芦娃二娃
博客等级 码龄15年 1850粉丝 69原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值