免费注册 查看新帖 |

Chinaunix

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

想做一个用系统ping多进程的PING测试.分析出最后结果. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-20 17:10 |只看该作者 |倒序浏览
如题.
代码如下

  1. #!/usr/bin/perl
  2. #ver 1.1.0
  3. #auth FB
  4. #lastModify 20070606 18:20
  5. #date,name,ip,size,min,avg,max,loss
  6. #%date,%name,%size,%min,%avg,%max,%loss
  7. use strict;
  8. no strict "refs" ;
  9. use Data::Dumper;
  10. my %name;
  11. #my $dir="/root/ping/";`mkdir -p $dir`;
  12. my $config="/root/scripts/data.ini";
  13. #read config start
  14. open DATA,"$config";
  15. foreach my $data(<DATA>){
  16.         chomp($data);
  17.         if ($data !~ /^#/){
  18.                 my ($tmpname,$tmpip)=split/\=/,$data;
  19.                 $name{$tmpip}=$tmpname;
  20.         }
  21. }
  22. close DATA;
  23. #read config end




  24. sub ping(@_) {
  25.         my $ip=shift;
  26.         my $times=shift;
  27.         my $size=shift;
  28.         my $dt=time;
  29.         my $loss;
  30.         my $tmpresult=`/bin/ping -c $times -s $size $ip`;
  31.         $tmpresult =~ m/(.*min\/avg\/max\/.*\=)(.*) (ms|usec)/;
  32.         ($$ip{min},$$ip{avg},$$ip{max})=split(/\//,$2);
  33.         #printf ("%s%s%s\n",$min,$avg,$max,$tmp);
  34.         $tmpresult =~ m/(.*\,)(.*) (packet loss)/;
  35.         $loss=$2;
  36.         $loss=~ s/\%//g;
  37.         #print $loss."\n";
  38.         ${$ip}{dt}=$dt;
  39.         ${$ip}{size}=$size;
  40.         ${$ip}{times}=$times;
  41.         ${$ip}{loss}=$loss;
  42.         return \%$ip;
  43. }

  44. #foreach (keys %name){
  45.         #ping($_,"2","16");
  46. #}
  47. my %pid_to_host;
  48. foreach my $tmpip (keys %name){
  49.         if (my $pid = fork){
  50.                 $pid_to_host{$pid} = $tmpip;
  51.                 warn "$pid is processing $tmpip\n";
  52.         } else {
  53.                 ping($tmpip,"2","16");
  54.                 exit;
  55.         }
  56. }
  57. while (keys %pid_to_host){
  58.         my $pid = wait;
  59.         last if $pid <0;
  60.         my $host = delete $pid_to_host{$pid}
  61.                 or warn("why did I see $pid($?)\n"),next;
  62.         warn "reaping $pid for $host\n";
  63. }

  64. foreach (keys %name){
  65.         printf("%s,%s,%s,%s,%s,%s\n",$$_{dt},$$_{min},$$_{max},$$_{avg},$$_{loss},$$_{size});
  66. }
复制代码

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

论坛徽章:
0
2 [报告]
发表于 2007-06-20 17:11 |只看该作者
data.ini
文件格式
hostname=192.168.0.1
hostname2=192.168.0.2

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

[ 本帖最后由 babyles 于 2007-6-20 17:14 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-06-21 17:25 |只看该作者
没人顶.我明白可能的原因.fork 进程后,后面进行进程回收.保存数据的hash应该也被destroy.

论坛徽章:
0
4 [报告]
发表于 2007-06-22 22:40 |只看该作者

论坛徽章:
0
5 [报告]
发表于 2007-10-29 15:19 |只看该作者

回复 #1 babyles 的帖子

if (my $pid = fork)
这句话什么意思呢??
如果是判断是子进程在话,它写法就有问题,

论坛徽章:
0
6 [报告]
发表于 2007-10-29 15:25 |只看该作者
%pid_to_host,这个hash,子进程也会继承,但他们在各自但存储空间里,子进程只能改变子进程变量空间中但%pid_to_host,不会影响父进程%pid_to_host的,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP