首页 fork函数返回值浅谈

fork函数返回值浅谈

举报
开通vip

fork函数返回值浅谈fork函数返回值浅谈fork函数返回值浅谈fork简介fork英文原意是分岔分支的意思而在操作系统中乃是著名的Unix或类Unix如LinuxMinix中用于创建子进程的系统调用。【NOTE1】fork的作用是什么换句话说你用fork的目的是什么――是为了产生一个新的进程地球人都知道产生一个什么样的进程――和你本来调用fork的那个进程基本一样的进程其实就是你原来进程的副本真的完全一样吗――当然不能完全一样你要两个除了pid之外其它一模一样的进程干什么就算memory再多也不用这么摆谱吧哪里不一样――当然最重要的...

fork函数返回值浅谈
fork函数返回值浅谈fork函数返回值浅谈fork简介fork英文原意是分岔分支的意思而在操作系统中乃是著名的Unix或类Unix如LinuxMinix中用于创建子进程的系统调用。【NOTE1】fork的作用是什么换句话说你用fork的目的是什么――是为了产生一个新的进程地球人都知道产生一个什么样的进程――和你本来调用fork的那个进程基本一样的进程其实就是你原来进程的副本真的完全一样吗――当然不能完全一样你要两个除了pid之外其它一模一样的进程干什么就算memory再多也不用这么摆谱吧哪里不一样――当然最重要的是fork之后执行的代码不一样youknowiknow怎么实现呢――如果是Windows它会让你在fork里面提供一大堆东西指明这个那个什么的…我用的是unix啊――所以很简单unix会让两个进程不错原来是一个unix替你复制了一个现在有两个在fork之后产生不同返回值不同。其中一个进程使用新的pid里面的fork返回零这个进程就是子进程而另一个进程使用原来的pid中的fork返回前面那个子进程的pid他自己被称为父进程然后呢――写代码的人又不笨当然就根据返回值是否非零来判断了现在我是在子进程里面呢还是在父进程里面在子进程里面就执行子进程该执行的代码在父进程里面就执行父进程的代码…有铁杆windowsfans借此说明windows好啊子进程用子进程的代码父进程用父进程的你unix笨了吧子进程包含父进程、子进程的代码父进程包含父进程子进程的代码岂不是多占用内存了吗――据我所知unix代码段都是可重入代码也就是说进程复制并不复制代码段若干个进程共享同一代码段增加的只是全局共享数据和对文件描述符的引用等另外就是堆栈。你一个代码长达10M的进程fork出三四个子进程只是增加一点内存占用如果你没有使用很多全局变量的话而不是占用40M以上的内存。【NOTE2】程序从fork开始分支称分支不准确一路是主进程pid0pid是子进程ID一路是子进程pid0自此分成两个任务其实fork的时候已经两个分支了数据段被复制了一份因此pid有两份执行pidfork时返回值赋给pid在两个进程中运行fork会返回给父进程的那个0的值告诉调用者新建进程的pid子进程的fork返回值是0更不用说if.else的比较也是在两个进程中都做的了【NOTE3】fork的精辟剖析程序如下includeunistd.hincludesys/types.hmainpid_tpidpidforkifpid0printferrorinforkelseifpid0printfiamthechildprocessmyprocessidisdngetpidelseprintfiamtheparentprocessmyprocessidisdngetpid结果是rootlocalhostc./a.outiamthechildprocessmyprocessidis4286iamtheparentprocessmyprocessidis4285一要搞清楚fork的执行过程就必须先讲清楚操作系统中的进程process概念。一个进程主要包含三个元素o.一个可以执行的程序o.和该进程相关联的全部数据包括变量内存空间缓冲区等等o.程序的执行上下文executioncontext。不妨简单理解为一个进程 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示的就是一个可执行程序的一次执行过程中的一个状态。操作系统对进程的管理典型的情况是通过进程表完成的。进程表中的每一个表项记录的是当前操作系统中一个进程的情况。对于单CPU的情况而言每一特定时刻只有一个进程占用CPU但是系统中可能同时存在多个活动的等待执行或继续执行的进程。一个称为程序计数器programcounterpc的寄存器指出当前占用CPU的进程要执行的下一条指令的位置。当分给某个进程的CPU时间已经用完操作系统将该进程相关的寄存器的值保存到该进程在进程表中对应的表项里面把将要接替这个进程占用CPU的那个进程的上下文从进程表中读出并更新相应的寄存器这个过程称为上下文交换processcontextswitch实际的上下文交换需要涉及到更多的数据那和fork无关不再多说主要要记住程序寄存器pc指出程序当前已经执行到哪里是进程上下文的重要内容换出CPU的进程要保存这个寄存器的值换入CPU的进程也要根据进程表中保存的本进程执行上下文信息更新这个寄存器。好了有这些概念打底可以说fork了。当你的程序执行到下面的语句pidfork操作系统创建一个新的进程子进程并且在进程表中相应为它建立一个新的表项。新进程和原有进程的可执行程序是同一个程序上下文和数据绝大部分就是原进程父进程的拷贝但它们是两个相互独立的进程此时程序寄存器pc在父、子进程的上下文中都声称这个进程目前执行到fork调用即将返回此时子进程不占有CPU子进程的pc不是真正保存在寄存器中而是作为进程上下文保存在进程表中的对应表项内。问题是怎么返回在父子进程中就分道扬镳。父进程继续执行操作系统对fork的实现使这个调用在父进程中返回刚刚创建的子进程的pid一个正整数所以下面的if语句中pid0pid0的两个分支都不会执行。所以输出iamtheparentprocess.子进程在之后的某个时候得到调度它的上下文被换入占据CPU操作系统对fork的实现使得子进程中fork调用返回0。所以在这个进程注意这不是父进程了哦虽然是同一个程序但是这是同一个程序的另外一次执行在操作系统中这次执行是由另外一个进程表示的从执行的角度说和父进程相互独立中pid0。这个进程继续执行的过程中if语句中pid0不满足但是pid0是true。所以输出iamthechildprocess.为什么看上去程序中互斥的两个分支都被执行了在一个程序的一次执行中这当然是不可能的但是你看到的两行输出是来自两个进程这两个进程来自同一个程序的两次执行。fork之后操作系统会复制一个与父进程完全相同的子进程虽说是父子关系但是在操作系统看来他们更像兄弟关系这2个进程共享代码空间但是数据空间是互相独立的子进程数据空间中的内容是父进程的完整拷贝指令指针也完全相同但只有一点不同如果fork成功子进程中fork的返回值是0父进程中fork的返回值是子进程的进程号如果fork不成功父进程会返回错误。可以这样想象2个进程一直同时运行而且步调一致在fork之后他们分别作不同的工作也就是分岔了。这也是fork为什么叫fork的原因。在程序段里用了fork之后程序出了分岔派生出了两个进程。具体哪个先运行就看该系统的调度算法了。如果需要父子进程协同可以通过原语的 办法 鲁班奖评选办法下载鲁班奖评选办法下载鲁班奖评选办法下载企业年金办法下载企业年金办法下载 解决。二进程的创建创建一个进程的系统调用很简单.我们只要调用fork函数就可以了.includeunistd.hpid_tfork当一个进程调用了fork以后系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程ID和父进程ID其他的都是一样.就象父进程克隆clone自己一样.当然创建两个一模一样的进程是没有意义的.为了区分父进程和子进程我们必须跟踪fork的返回值.当fork掉用失败的时候内存不足或者是用户的最大进程数已到fork返回-1否则fork的返回值有重要的作用.对于父进程fork返回子进程的ID而对于fork子进程返回0.我们就是根据这个返回值来区分父子进程的.父进程为什么要创建子进程呢前面我们已经说过了Linux是一个多用户操作系统在同一时间会有许多的用户在争夺系统的资源.有时进程为了早一点完成任务就创建子进程来争夺资源.一旦子进程被创建父子进程一起从fork处继续执行相互竞争系统的资源.有时候我们希望子进程继续执行而父进程阻塞直到子进程完成任务.这个时候我们可以调用wait或者waitpid系统调用. 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf 一下有三1派生子进程的进程即父进程其pid不变2对子进程来说fork返回给它0但它的pid绝对不会是0之所以fork返回0给它是因为它随时可以调用getpid来获取自己的pid3fork之后父子进程除非采用了同步手段否则不能确定谁先运行也不能确定谁先结束。认为子进程结束后父进程才从fork返回的这是不对的fork不是这样的vfork才这样。【NOTE4】首先必须有一点要清楚函数的返回值是储存在寄存器eax中的。其次当fork返回时新进程会返回0是因为在初始化任务结构时将eax设置为0在fork中把子进程加入到可运行的队列中由进程调度程序在适当的时机调度运行。也就是从此时开始当前进程分裂为两个并发的进程。无论哪个进程被调度运行都将继续执行fork函数的剩余代码执行结束后返回各自的值。【NOTE5】对于fork来说父子进程共享同一段代码空间所以给人的感觉好像是有两次返回其实对于调用fork的父进程来说如果fork出来的子进程没有得到调度那么父进程从fork系统调用返回同时分析sys_fork知道fork返回的是子进程的id。再看fork出来的子进程由copy_process函数可以看出子进程的返回地址为ret_from_fork和父进程在同一个代码点上返回返回值直接置为0。所以当子进程得到调度的时候也从fork返回返回值为0。关键注意两点1.fork返回后父进程或子进程的执行位置。首先会将当前进程eax的值做为返回值2.两次返回的pid存放的位置。eax中进程调用copy_process得到lastpid的值放入eax中fork正常返回后父进程中返回的就是lastpid子进程任务状态段tss的eax被设置成0fork.c中p-tss.eax0如果子进程要执行就需要进程切换当发生切换时子进程tss中的eax值就调入eax寄存器子进程执行时首先会将eax的内容做为返回值当子进程开始执行时copy_process返回eax的值。fork后就是两个任务同时进行父进程用他的tss子进程用自己的tss在切换时各用各的eax中的值.所以一次调昧酱畏祷厥?个不同的进程看这一句pidfork当执行这一句时当前进程进入fork运行此时fork内会用一段嵌入式汇编进行系统调用int0x80具体代码可参见内核版本0.11的unistd.h文件的133行_syscall0函数。这时进入内核根据此前写入eax的系统调用功能号便会运行sys_fork系统调用。接着sys_fork中首先会调用C函数find_empty_process产生一个新的进程然后会调用C函数copy_process将父进程的内容复制给子进程但是子进程tss中的eax值赋值为0这也是为什么子进程中返回0的原因当赋值完成后copy_process会返回新进程该子进程的pid这个值会被保存到eax中。这时子进程就产生了此时子进程与父进程拥有相同的代码空间程序指针寄存器eip指向相同的下一条指令地址当fork正常返回调用其的父进程后因为eax中的值是新创建的子进程号所以fork返回子进程号执行elsepid0当产生进程切换运行子进程时首先会恢复子进程的运行环境即装入子进程的tss任务状态段其中的eax值copy_process中置为0也会被装入eax寄存器所以当子进程运行时fork返回的是0执行ifpid0。【NOTE5】理解它关键在于理解堆栈的切换和压栈弹栈关于子进程的返回子进程复制了父进程的栈内容从高到低SSESPEFLAGSCSEIP---此是int0x80的下一条指令也是子进程开始执行的地方DSESFSEDXECXEBXGSESIEDIEBPEAX0由于EAX0所以子进程返回0给fork.注新进程的用户栈设为其父进程的用户栈最后弹出的SSESP。如果父子进程以copy_on_write方式共用用户堆栈Linux之下就是这样的而且在此之前父进程修改了该堆栈如果父进程先返回这几乎是肯ǖ哪敲聪低骋丫附檀唇烁糜没д坏母北靖附淘吹挠没д涣舾俗咏獭,敲葱陆痰南低痴灰丫蹇招陆袒氐搅擞没祷氐搅撕齠ork。【NOTE6】关于fork的讨论与评价fork好不好相比其他操作系统如WindowsWindows会有诸如CreateProcess这样的函数来创建一个与生俱来两手空空的独立的新进程。然后还有一大堆参数指手画脚的告诉你这个那个是什么。烦K.I.S.S.Keepitsimplestupid.是Unix的至高原则。fork起源于Unix操作系统。那是贝尔实验室的KR这两人是Unix和C语言之父的一项天才发明Linux由于与生俱来就与Unix血浓于水所以继承了它的这个天才发明。这种方法效率是很高的。因为复制的代价是很低的。在计算机网络的实现中以及在client/server系统中的server一方的实现中fork常常是最自然最有效最适宜的手段。很多人甚至怀疑到底是先有fork还是先有client/server因为fork似乎就是专门为此而设计的更重要的好处是这样有利于父子进程间通过pipe建立起一种简单有效的进程间通信管道并且产生了操作系统的用户界面即shell的管道机制。这一点对于Unix的发展和应用推广对于Uinx程序设计环境的形成对于Unix程序设计风格的形成都有非常深远的影响。可以说这是一项天才的发明它在很大程度上改变了操作系统的发展方向。
本文档为【fork函数返回值浅谈】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_153723
暂无简介~
格式:doc
大小:33KB
软件:Word
页数:7
分类:其他高等教育
上传时间:2017-09-20
浏览量:19