免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2146 | 回复: 9
打印 上一主题 下一主题

[求助]多进程访问某url,子进程退出时候,发现无法捕获到CHLD信号 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-29 18:23 |只看该作者 |倒序浏览
本帖最后由 MayIKissU 于 2011-12-29 18:24 编辑

需求来源:测试某功能的时候需要经过某设备访问大量的url(下面使用单一的url进行实验)
代码编写环境:ubuntu
问题描述:
控制进程维持在10个,访问总共1000个url,发现首先创建的10个子进程,在子进程退出的时候,并没有被我的信号处理函数处理到,
导致系统一致是10个僵死进程,没有进行以下的创建。

代码如下

  1. #! /usr/bin/perl -w
  2. use strict;
  3. use warnings;
  4. use LWP;
  5. use HTTP::Request;
  6. use POSIX ":sys_wait_h";

  7. my $collect = 0;  #收割僵死进程计数
  8. my $num_pro = 0;  #创建进程个数
  9. my $zombies = 0;  #接收到子进程退出信号后计数

  10. $SIG{CHLD} = sub {$zombies++;};  #当子进程退出要收割的时候
  11. foreach(1..1000){
  12.         my $pid = fork();    #总共创建1000个,
  13.       if(!defined($pid)){  #查看创建子进程成功与否
  14.       die "can not fork";              
  15.         }
  16.         if($pid){            #父进程
  17.       }
  18.         elsif($pid == 0)  #子进程
  19.       {     
  20.         print "child\n";     #调试信息
  21.       my $lwp = LWP::UserAgent->new(timeout => 1);
  22.         my $request = HTTP::Request->new(GET => "http://www.baidu.com");
  23.         $request->header(Accept => "*/*");
  24.         my $reponse = $lwp->request($request);
  25.         exit(0);             #退出子进程
  26.       }
  27.         $num_pro++;          #创建一个子进程,计数加1
  28.         
  29.         print $zombies,"\n"; #调试信息

  30.       if($zombies>0)       #回收子进程
  31.       {
  32.             while(my $test=waitpid(-1,WNOHANG) > 0)
  33.             {
  34.                print "in?\n";        #调试信息
  35.            $zombies--;
  36.                $collect++;
  37.             }
  38.          }

  39.         while(($num_pro-$collect)>10)  #维持子进程个数
  40.       {
  41.                sleep 1;
  42.          }
  43. }
复制代码
图上#调试的地方为自己调试的信息,发现问题出在子进程创建退出之后,chld信号并没有被捕获,导致了 $zombies并没有增加,从而我的子进程并没有被回收!

帮忙看下把  版友们!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2011-12-29 18:33 |只看该作者
POE

我早就不自己处理信号了。

论坛徽章:
0
3 [报告]
发表于 2011-12-29 18:35 |只看该作者
回复 2# flw
额!出问题拉 我想弄明白哪里出的这个问题!然后再用其他方式写这个!!有提示的方向么 版主!


   

论坛徽章:
0
4 [报告]
发表于 2011-12-29 20:13 |只看该作者
$SIG{CHLD} = sub {$zombies++;};


真佩服你,相当杯具,这样做意义何在?
你要自己处理SIGCHLD的话,起码也要调用waitpid回收子进程。

论坛徽章:
0
5 [报告]
发表于 2011-12-29 20:42 |只看该作者
回复 4# 兰花仙子
亲!上面那个是计数嘛,exit一个就增加一个计数,下面代码里的

  1.       if($zombies>0)       #回收子进程

  2.       {
  3.             while(my $test=waitpid(-1,WNOHANG) > 0)

  4.             {

  5.                print "in?\n";        #调试信息

  6.                $zombies--;

  7.                $collect++;

  8.             }

  9.          }

复制代码
用来回收子进程!个人觉得每次exit后发送信号CHLD,zombies就加1啊,但是我调试的过程中发现进程是exit了,但是信号没有捕获到,打印出的zombie值为0!

   

论坛徽章:
0
6 [报告]
发表于 2011-12-29 21:35 |只看该作者
mark .....

论坛徽章:
0
7 [报告]
发表于 2011-12-30 09:43 |只看该作者
回复 2# flw


    POE可以处理信号问题吗?我怎么没听说过,版主解释一下啊.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2011-12-30 10:47 |只看该作者
本帖最后由 flw 于 2011-12-30 10:47 编辑
kingwmj 发表于 2011-12-30 09:43
回复 2# flw

对呀,为什么你就没听说过呢?真奇怪。

论坛徽章:
2
金牛座
日期:2013-09-06 09:16:182015年迎新春徽章
日期:2015-03-04 09:53:17
9 [报告]
发表于 2011-12-30 10:59 |只看该作者
POE把很多底层的东西都封装起来了

论坛徽章:
0
10 [报告]
发表于 2011-12-30 12:30 |只看该作者
回复 8# flw

不奇怪,水平比较差
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP