use strict; use warnings; use Data::Dumper; use CGI::Carp qw/fatalsToBrowser/; use CGI; my $cgi = new CGI; unless ($cgi->param()) { print "Content-type: text/html\n\n"; print "
"; } else { my $param = $cgi->param('test'); my @patterns = find_patterns($param); print Dumper( lookup(@patterns) ); } #---------------------------------- sub lookup(@) { BEGIN { unshift @INC, "/home/test/lib" } use XML_Client qw(:default); use Data::Dumper; $SIG{CHLD} = \&sig_chld; my @search = @_; my %return; my @spawn; my $XML_Client = new XML_Client(); $XML_Client->login; use IO::Handle; pipe(READER, WRITER); #WRITER->autoflush(1); for (0..$#search) { my $pid = &child($search[$_], $XML_Client); push @spawn, $pid; } close WRITER; local $SIG{ALRM} = sub { die "timeout\n" }; alarm 20; waitpid($spawn[-1],0); for (0..$#search-1) { my $feedback = ; chomp $feedback; $return{$_} = $feedback; } alarm 0; return %return; END { $XML_Client->logout if $XML_Client } #------------------------------- sub child($$) { my $search = shift; my $XML_Client = shift; my $return; unless (my $pid = fork) { close READER; local $SIG{ALRM} = sub { die "child timeout\n" }; my $lookup_data = { action => "lookup", attributes => { search => $search, } }; my $lookup_results; eval { local $SIG{ALRM} = sub { die "child timeout\n" }; alarm 15; $lookup_results = $XML_Client->send_cmd( $lookup_data ) or warn PROG $!; alarm 0; }; if ($@) { #timed out die unless $@ eq "child timeout\n"; } else { print WRITER $lookup_results->{status} . "\n"; exit 1; } return $pid; } #----------------------------------- sub sig_chld { use POSIX ":sys_wait_h"; my $child = waitpid(-1, WNOHANG); $SIG{CHLD} = \&sig_chld; }