- 论坛徽章:
- 0
|
本帖最后由 MayIKissU 于 2011-12-29 18:24 编辑
需求来源:测试某功能的时候需要经过某设备访问大量的url(下面使用单一的url进行实验)
代码编写环境:ubuntu
问题描述:
控制进程维持在10个,访问总共1000个url,发现首先创建的10个子进程,在子进程退出的时候,并没有被我的信号处理函数处理到,
导致系统一致是10个僵死进程,没有进行以下的创建。
代码如下
- #! /usr/bin/perl -w
- use strict;
- use warnings;
- use LWP;
- use HTTP::Request;
- use POSIX ":sys_wait_h";
- my $collect = 0; #收割僵死进程计数
- my $num_pro = 0; #创建进程个数
- my $zombies = 0; #接收到子进程退出信号后计数
- $SIG{CHLD} = sub {$zombies++;}; #当子进程退出要收割的时候
- foreach(1..1000){
- my $pid = fork(); #总共创建1000个,
- if(!defined($pid)){ #查看创建子进程成功与否
- die "can not fork";
- }
- if($pid){ #父进程
- }
- elsif($pid == 0) #子进程
- {
- print "child\n"; #调试信息
- my $lwp = LWP::UserAgent->new(timeout => 1);
- my $request = HTTP::Request->new(GET => "http://www.baidu.com");
- $request->header(Accept => "*/*");
- my $reponse = $lwp->request($request);
- exit(0); #退出子进程
- }
- $num_pro++; #创建一个子进程,计数加1
-
- print $zombies,"\n"; #调试信息
- if($zombies>0) #回收子进程
- {
- while(my $test=waitpid(-1,WNOHANG) > 0)
- {
- print "in?\n"; #调试信息
- $zombies--;
- $collect++;
- }
- }
- while(($num_pro-$collect)>10) #维持子进程个数
- {
- sleep 1;
- }
- }
复制代码 图上#调试的地方为自己调试的信息,发现问题出在子进程创建退出之后,chld信号并没有被捕获,导致了 $zombies并没有增加,从而我的子进程并没有被回收!
帮忙看下把 版友们!
|
|