想做一个用系统ping多进程的PING测试.分析出最后结果.

想做一个用系统ping多进程的PING测试.分析出最后结果.

如题.
代码如下

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
#ver 1.1.0
#auth FB
#lastModify 20070606 18:20
#date,name,ip,size,min,avg,max,loss
#%date,%name,%size,%min,%avg,%max,%loss
use strict;
no strict "refs" ;
use Data::Dumper;
my %name;
#my $dir="/root/ping/";`mkdir -p $dir`;
my $config="/root/scripts/data.ini";
#read config start
open DATA,"$config";
foreach my $data(<DATA>){
        chomp($data);
        if ($data !~ /^#/){
                my ($tmpname,$tmpip)=split/\=/,$data;
                $name{$tmpip}=$tmpname;
        }
}
close DATA;
#read config end




sub ping(@_) {
        my $ip=shift;
        my $times=shift;
        my $size=shift;
        my $dt=time;
        my $loss;
        my $tmpresult=`/bin/ping -c $times -s $size $ip`;
        $tmpresult =~ m/(.*min\/avg\/max\/.*\=)(.*) (ms|usec)/;
        ($$ip{min},$$ip{avg},$$ip{max})=split(/\//,$2);
        #printf ("%s%s%s\n",$min,$avg,$max,$tmp);
        $tmpresult =~ m/(.*\,)(.*) (packet loss)/;
        $loss=$2;
        $loss=~ s/\%//g;
        #print $loss."\n";
        ${$ip}{dt}=$dt;
        ${$ip}{size}=$size;
        ${$ip}{times}=$times;
        ${$ip}{loss}=$loss;
        return \%$ip;
}

#foreach (keys %name){
        #ping($_,"2","16");
#}
my %pid_to_host;
foreach my $tmpip (keys %name){
        if (my $pid = fork){
                $pid_to_host{$pid} = $tmpip;
                warn "$pid is processing $tmpip\n";
        } else {
                ping($tmpip,"2","16");
                exit;
        }
}
while (keys %pid_to_host){
        my $pid = wait;
        last if $pid <0;
        my $host = delete $pid_to_host{$pid}
                or warn("why did I see $pid($?)\n"),next;
        warn "reaping $pid for $host\n";
}

foreach (keys %name){
        printf("%s,%s,%s,%s,%s,%s\n",$$_{dt},$$_{min},$$_{max},$$_{avg},$$_{loss},$$_{size});
}

如果不用多进程.单一进行,可以出结果.隐约知道问题在哪.但不是很明确.一开始以为多维hash传递出问题了.
应该是fork后出的问题,初步怀疑标准输入输出的问题.调试看到错误为得不到TREM.
data.ini
文件格式
hostname=192.168.0.1
hostname2=192.168.0.2

虽然可以有简单方法实现.但想深深研究一下perl,多进程,多线程,多维hash, 多维数组.

没人顶.我明白可能的原因.fork 进程后,后面进行进程回收.保存数据的hash应该也被destroy.
看看这个例子 http://wiki.perlchina.org/index. ... hings%2C_like_pings
if (my $pid = fork)
这句话什么意思呢??
如果是判断是子进程在话,它写法就有问题,
%pid_to_host,这个hash,子进程也会继承,但他们在各自但存储空间里,子进程只能改变子进程变量空间中但%pid_to_host,不会影响父进程%pid_to_host的,