in reply to Re^2: trying to get timeout to work (easier with threads)
in thread trying to get timeout to work
Here's an improved version.
This one returns as soon as the external command terminates.
This version will return as much as was available before the process was killed.
If the thread or process was slow starting due to system load or other factors, the old version could try to use $pid before it was set. This corrects that error.
#! perl -slw use strict; use threads; use threads::shared; $|++; our $N ||= 11; my $TIMEOUT = 10; my $extApp = q[ perl -lwe"$|++; print $_ and sleep 1 for 1 .. $ARGV[0] +" ]; my @results :shared; my $pid :shared; async { $pid = open my $fh, "$extApp $N |" or die "$!, $^E"; push @results, $_ while <$fh>; }->detach; sleep 1 until $pid; sleep 1 while kill 0, $pid and $TIMEOUT--; kill 3, $pid and warn 'Command timed out' if $TIMEOUT; print "command return \n'@results'"; __END__ C:\test>timeoutcmd -N=1 command return '1 ' C:\test>timeoutcmd -N=10 command return '1 2 3 4 5 6 7 8 9 10 ' C:\test>timeoutcmd -N=11 Command timed out at C:\test\timeoutcmd.pl line 21. command return '1 2 3 4 5 6 7 8 9 10 11 '
|
---|