Linux避免僵尸进程.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux避免僵尸进程

僵尸进程的避免?网上搜一搜,基本上就是这样的三种方式:signal(SIGCHLD, SIG_IGN),忽略SIGCHLD信号,这样子进程结束后,就不需要父进程来wait和释放资源fork两次,第一次fork的子进程在fork完成后直接退出,这样第二次fork得到的子进程就没有爸爸了(真可怜。。。),它会被自动过继给老祖宗init进程,init会负责释放它的资源,这样就不会由僵尸产生了对子进程进行wait,释放它们的资源。但是父进程一般没工夫在那里守着,等着子进程的退出,所以,一般使用信号的方式来处理,在收到SIGCHLD信号的时候,再临时用wait操作来释放它们的资源。?从个人角度,简单评价一下这三种方式:老爸不管儿子死活。父进程无法知晓子进程的退出情况。儿子自杀了,爷爷不管孙子。跟1一样,父进程无法知晓子进程的退出情况。老爸算是尽职了,儿子死了会给它火化(释放资源)。父进程可以知晓子进程的退出情况,不过处理比1和2麻烦。个人推荐第3种解决方法,这也引出了下面这样的一个问题。在《UNIX环境高级编程》10.8章节中有这样一段话:What happens if a blocked signal is generated more than once before the process unblocks the signal? POSIX.1 allows the system to deliver the signal either once or more than once. If the system delivers the signal more than once, we say that the signals are queued. Most UNIX systems, however, do not queue signals unless they support the real-time extensions to POSIX.1. Instead, the UNIX kernel simply delivers the signal once.这段话的意思是说:如果相同的信号在被在该进程解除对它的阻塞之前发生了多次,多数UNIX系统并不对该信号进行排队处理,也就是说,该信号将会被只递交一次。?这就是Linux中信号处理有一个特点,那就是,同一个信号被递交多次,如果第一个信号还在处理,那么后面的信号都会被丢弃,而不会进入队列中等待处理。如果我们只是简单的对这个信号处理,必然会丢失对后面相同信号的处理。?这个问题是在我写一个File Server的时候遇到的。这个文件服务器每接收一个Client请求,就fork一个进程对它进行处理。为了对这个Server进行压力测试,我在Client端生成了非常多的文件传输请求,同时为了测试Server的容错能力,我在这些请求生成后,按下Ctrl+C键中断了这些文件传输,发现每次执行这样的操作,Server端都会有大量的僵尸进程生成。研究了一整天,查阅了很多资料,并测试了多次,终于发现,原来这些僵尸进程的SIGCHLD信号被父进程给忽略了!没有对他们进行wait,从而导致了他们变成了僵尸进程!?下面举个简单的例子:[cpp:showcolumns]?view plaincopy·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150/*??*?main.cpp??*??*??Created?on:?Jun?17,?2011??*??????Author:?boyce??*/??#include?stdio.h??#include?stdlib.h??#include?unistd.h??#include?signal.h??#include?wait.h??#include?errno.h??int?num_clients?=?0;??int?dead_clients?=?0;??void?sig_chld_handler(int?sig)?{??????pid_t?pid;??????if?(sig?==?SIGCHLD)?{??????????pid?=?wait(NULL);??????????printf(A?child?dead,?current?child?number:?%d,?id:?%d/n,?++dead_clients,?pid);??????}??}??int?main(int?argc,?char?*

文档评论(0)

almm118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档