#! perl -slw use strict; $|++; my $extApp = q[ perl -lwe"$|++; print $_ and sleep 1 for 1 .. 10" ]; for my $timeout ( map $_*2, 4,5,6 ) { my @results = timedCommand( $extApp, $timeout ); if( @results ) { print "Command returned\n", join '', @results; } else { print "Command timed out after $timeout seconds"; } } sub timedCommand { use threads; use threads::shared; my( $cmd, $timeout ) = @_; my @results :shared; my $pid :shared; async { $pid = open my $fh, "$cmd |" or die "$!, $^E"; @results = <$fh>; }->detach; kill 0, $pid while sleep 1 and $timeout--; kill 3, $pid and return if $timeout; return @results; } __END__ c:\test>junk6 Command timed out after 8 seconds Command returned 1 2 3 4 5 6 7 8 9 10 Command returned 1 2 3 4 5 6 7 8 9 10