use threads; use Thread::Queue; use threads::shared; use IPC::Open2; sub pipeCommand ($$$$;@) { my $uut = shift; my $cmd = shift; my $test = shift; my $wd = $homedir; $wd .= shift; my @input = @_ ? @_ : (); my $thread = async { my $tid = threads->tid(); my ( $out, $in ); $cmd = "cd ".$wd."; ".$cmd; my $pid = open2( $out, $in, $cmd ); print $in "$_\n" foreach (@input); close $in or warn "close of input: $! $?\n"; my $err = 0; while (<$out>) { last if ($die); #drops me out of loop and lets me exit cleanly chomp; $err = 1 if (/^thread failed/); next unless length $_; $Q->enqueue("$tid:$uut:$test:$_"); last if ($err); } kill( 2, $pid ) if ($err or $die); close $out or warn "close of output: $! $?\n"; my $kpid = waitpid ($pid, 0); $Q->enqueue("$tid:$uut:$test:ENDEND"); return; }; $thread->detach(); return ( $thread->tid() ); }