local $/ = undef; for ($i=0;$i<=$#hosts;$i++) { $pings[$i][0] = $hosts[$i]; my $pid; $pid = open $pings[$i][1], "-|", "$pingcmd $hosts[$i] $pingsize $pingnumber" or die "Error executing $pingcmd: $!\n";; my $old_flags = fcntl($pings[$i][1], F_GETFL, 0) or die "can't get flags: $!"; fcntl($pings[$i][1], F_SETFL, $old_flags | O_NONBLOCK) or die "can't set non blocking: $!"; $pings[$i][2] = $pid; print "$pingcmd, $hosts[$i], $pingsize, $pingnumber failure\n" unless $pid; } READ: while (@pings) { for ($i=$#pings;$i>=0;$i--) { my $buf; my $len = sysread $pings[$i][1], $buf, 580; if (not defined $len) { # loop } elsif ($len > 0) { # loop } elsif ($len == 0) { # we're done, end loop #print "read length 0 $pings[$i][0] pid $pings[$i][2]\n"; # if (kill 0, $pings[$i][2]) { # print "process $pings[$i][2] still alive\n"; # kill 9, $pings[$i][2]; # } # readline $pings[$i][1]; close $pings[$i][1]; # waitpid $pings[$i][2], 0; $results{$pings[$i][0]}{status} = $? >> 8; splice @pings, $i, 1; } else { die; } } sleep 1; }