linux避僵尸进程精选

linux避僵尸进程精选

ID:33465465

大小:177.19 KB

页数:7页

时间:2019-02-26

linux避僵尸进程精选_第1页
linux避僵尸进程精选_第2页
linux避僵尸进程精选_第3页
linux避僵尸进程精选_第4页
linux避僵尸进程精选_第5页
资源描述:

《linux避僵尸进程精选》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、僵尸进程的避免 网上搜一搜,基本上就是这样的三种方式:1.signal(SIGCHLD,SIG_IGN),忽略SIGCHLD信号,这样子进程结束后,就不需要父进程来wait和释放资源2.fork两次,第一次fork的子进程在fork完成后直接退出,这样第二次fork得到的子进程就没有爸爸了(真可怜。。。),它会被自动过继给老祖宗init进程,init会负责释放它的资源,这样就不会由"僵尸"产生了3.对子进程进行wait,释放它们的资源。但是父进程一般没工夫在那里守着,等着子进程的退出,所以,一般使用信号的方式来

2、处理,在收到SIGCHLD信号的时候,再临时用wait操作来释放它们的资源。 从个人角度,简单评价一下这三种方式:1.老爸不管儿子死活。父进程无法知晓子进程的退出情况。2.儿子自杀了,爷爷不管孙子。跟1一样,父进程无法知晓子进程的退出情况。3.老爸算是尽职了,儿子死了会给它火化(释放资源)。父进程可以知晓子进程的退出情况,不过处理比1和2麻烦。个人推荐第3种解决方法,这也引出了下面这样的一个问题。在《UNIX环境高级编程》10.8章节中有这样一段话:Whathappensifablockedsignalisge

3、neratedmorethanoncebeforetheprocessunblocksthesignal?POSIX.1allowsthesystemtodeliverthesignaleitheronceormorethanonce.Ifthesystemdeliversthesignalmorethanonce,wesaythatthesignalsarequeued.MostUNIXsystems,however,donotqueuesignalsunlesstheysupportthereal-time

4、extensionstoPOSIX.1.Instead,theUNIXkernelsimplydeliversthesignalonce.这段话的意思是说:如果相同的信号在被在该进程解除对它的阻塞之前发生了多次,多数UNIX系统并不对该信号进行排队处理,也就是说,该信号将会被只递交一次。 这就是Linux中信号处理有一个特点,那就是,同一个信号被递交多次,如果第一个信号还在处理,那么后面的信号都会被丢弃,而不会进入队列中等待处理。如果我们只是简单的对这个信号处理,必然会丢失对后面相同信号的处理。 这个问题是在我

5、写一个FileServer的时候遇到的。这个文件服务器每接收一个Client请求,就fork一个进程对它进行处理。为了对这个Server进行压力测试,我在Client端生成了非常多的文件传输请求,同时为了测试Server的容错能力,我在这些请求生成后,按下Ctrl+C键中断了这些文件传输,发现每次执行这样的操作,Server端都会有大量的僵尸进程生成。研究了一整天,查阅了很多资料,并测试了多次,终于发现,原来这些僵尸进程的SIGCHLD信号被父进程给忽略了!没有对他们进行wait,从而导致了他们变成了僵尸进程!

6、 下面举个简单的例子:[cpp:showcolumns] viewplaincopy·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······1501./* 2. * main.cpp 3. * 4. *  Created on: Jun 17, 2011 5. *     

7、 Author: boyce 6. */  7.#include   8.#include   9.#include   10.#include   11.#include   12.#include   13.int num_clients = 0;  14.int dead_clients = 0;  15.void sig_chld_handler(int sig) {  1.    pid_t

8、 pid;  2.    if (sig == SIGCHLD) {  3.        pid = wait(NULL);  4.        printf("A child dead, current child number: %d, id: %d/n", ++dead_clients, pid);  5.    }  6.}  7.int main(int argc, ch

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。