




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在UNIX系统中,一个进程结束了,但是他的父进程没有等待(调用wait/waitpid)他,那么他将变成一个僵尸进程.但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init来接管他,成为他的父进程一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)僵尸进程的危害由于子进程的
2、结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束.那么不会因为父进程太忙来不及waid子进程,或者说不知道子进程什么时候结束,而丢失子进程结束时的状态信息呢?不会.因为UNIX提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息,就可以得到.这种机制就是:在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等.但是仍然为其保留一定的信息(包括进程号theprocessID,退出状态theterminationstatusoftheprocess,运行时间theamountofCPUtimetakenbytheprocess等),直至U父
3、进程通过wait/waitpid来取时才释放.但这样就导致了问题,如果你进程不调用wait/waitpid的话,那么保留的那段信息就不会释放,其进程号就会一定被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程.此即为僵尸进程的危害,应当避免.僵尸进程的避免父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会收到该信号,可以在handler中调用wait回收如果父进程不关心子进程什么时候结束,那么可以用sig
4、nal(SIGCHLD,SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号还有一些技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要自己做。下面就是Stevens给的采用两次folk避免僵尸进程的示例.3、僵尸进程的处理:它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态;存在的问题:如果父进程是一个循
5、环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程,系统的性能可能会收至影响。*如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。4、子进程结束后为什么要进入僵尸状态?*因为父进程可能要取得子进程的退出状态等信息。5、僵尸状态是每个子进程比经过的状态吗?是的。*任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是“
6、Z”。如果父进程能及时处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。*如果父进程在子进程结束之前退出,则子进程将由init接管。init将会以父进程的身份对僵尸状态的子进程进行处理。6、如何查看僵尸进程:$ps-el其中,有标记为Z的进程就是僵尸进程S代表休眠状态;D代表不可中断的休眠状态;R代表运行状态;Z代表僵死状态;T代表停止或跟踪状态wait系统调用系统中的僵尸进程都要由wait系统调用来回收,下面就通过实战看一看wait的具体用法:wait的函数原型是:#include/*提供类型pid_t的定义*/#includepid_twait(int*s
7、tatus);进程一旦调用了wait,就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。参数status用来保存被收集进程退出时的一些状态,它是一个指向int类型的指针。但如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,(事实上绝大多数情况下,我们都会这样想),我们就可以设定这个参数为NULL,就象下面这样:pid=wait(NULL);如果成功,wait会返回被收集的子进程的进程I
8、D,如果调用进程没有子进程,调用就会失败,此时wait返回-1,同时errno被置为ECHILD。下面就让我们用一个例子来实战应用一下wait调用:/*wait1.c*/#include#include#include#include#include#includeintmain()pid_tpc,pr;pc=fork();if(pc0)/*子进程正常返回*/printf(Icatchedachildprocesswithpidof%dn,pr);else/*出错*/printf(error:%sn.n,strerror(errno);exit(0);编译并运行:$gccwait1.c-owa
9、it1$./wait1Iamchildprocesswithpid2351Nowinparentprocess,pid=2350Iamwaitingchildprocesstoexit.Icatchedachildprocesswithpidof2351可以明显注意到,在第2行结果打印出来前有10秒钟的等待时间,这就是我们设定的让子进程睡眠的时间,只有子进程从睡眠中苏醒过来,它才能正常退出,也就才能被父进程捕捉到。其实这里我们不管设定子进程睡眠的时间有多长,父进程都会一直等待下去,读者如果有兴趣的话,可以试着自己修改一下这个数值,看看会出现怎样的结果。如果参数status的值不是NULL,wa
10、it就会把子进程退出时的状态取出并存入其中,这是一个整数值(int),指出了子进程是正常退出还是被非正常结束的(一个进程也可以被其他进程用信号结束,我们将在以后的文章中介绍),以及正常结束时的返回值,或被哪一个信号结束的等信息。由于这些信息被存放在一个整数的不同二进制位中,所以用常规的方法读取会非常麻烦,人们就设计了一套专门的宏(macro)来完成这项工作,下面我们来学习其中最常用的两个:1,WIFEXITED(status)这个宏用来指出子进程是否为正常退出的,如果是,它会返回一个非零值。(请注意,虽然名字一样,这里的参数status并不同于wait唯一的参数-指向整数的指针status,而
11、是那个指针所指向的整数,切记不要搞混了。2,WEXITSTATUS(status)当WIFEXITED返回非零值时,我们可以用这个宏来提取子进程的返回值,如果子进程调用exit(5)退出,WEXITSTATUS(status)就会返回5;如果子进程调用exit(7),WEXITSTATUS(status)就会返回7。请注意,如果进程不是正常退出的,也就是说,WIFEXITED返回0,这个值就毫无意义。下面通过例子来实战一下我们刚刚学到的内容:/*wait2.c*/#include#include#includeintmain()intstatus;pid_tpc,pr;pc=fork();if
12、(pc0)/*如果出错*/printf(erroroccured.n);elseif(pc=0)/*子进程*/printf(Thisischildprocesswithpidof%d.n,getpid();exit(3);/*子进程返回3*/else/*父进程*/pr=wait(&status);if(WIFEXITED(status)/*如果WIFEXITED返回非零值*/printf(Thechildprocess%dexitnormally.n,pr);printf(thereturncodeis%d.n,WEXITSTATUS(status);else/*如果WIFEXITED返回零*/printf(Thechildprocess%dexitabnormally.n,pr);exit(0);编译并运行:$gccwait2.c-owait2$./wait2This
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 球房球杆出租合同协议
- 租聘合同免责协议书模板
- 土地及厂房买卖合同协议
- 疫情器材租赁合同协议
- 画师聘请合同协议模板
- 土建协议合同协议
- 社区美食合伙人合同协议
- 租赁生产经营合同协议
- 租房免租金协议合同
- 租借电玩设备合同协议
- 电力工程钢网架安装工程检验批质量验收记录表
- 小学三年级音乐《马兰谣》课件
- “当代文化参与”学习任务群相关单元的设计思路与教学建议课件(共51张PPT)
- 提高卧床患者踝泵运动的执行率品管圈汇报书模板课件
- 同理心的应用教学教材课件
- DB4102-T 025-2021海绵城市建设施工与质量验收规范-(高清现行)
- 城市轨道交通安全管理隐患清单
- 锡膏使用记录表
- 儿童保健学课件:绪论
- 中小学校园安全稳定工作岗位责任清单
- 校园安全存在问题及对策
评论
0/150
提交评论