sub run_command
{
my $COMMAND = shift;
my @OUTPUT;
my %CMD = {};
$CMD{pid} = open3(my $CH_IN, my $CH_OUT, my $CH_ERR, $COMMAND);
$CMD{_STDIN} = $CH_IN;
$CMD{_STDOUT} = $CH_OUT;
$CMD{_STDERR} = $CH_ERR;
my $line = readline $CMD{_STDOUT};
print $line;
# open my $CMDPROC, q{-|}, $COMMAND or return;
# foreach (<$CMDPROC>)
# {
# push @OUTPUT, "$ARG";
# }
close $CMDPROC or return;
return @OUTPUT
}
上記のコードは、別のスクリプト (子と呼ばれる) を実行する必要がある、私が書いているスクリプトの一部です。/var/tmp に Cookie ファイルが存在するかどうかによって、子プロセスは入力を求められる場合とされない場合があります (どちらのスクリプトも CentOS5 / perl 5.8.8 で記述されています)。
親が親の STDIN から入力を渡すことができるように、子が入力を待っているかどうか、いつ待っているかを判断する必要があります。また、親が Perl::Critic の残忍な (重大度 1) チェックに合格する必要があるため、open3 を使用して子プロセスを開く必要があります。
コメントを含めたのは、Cookie ファイルが既に設定されている場合、少なくとも親に子を適切に呼び出させることができるためです。その場合、子は入力を待機しないためです。
子供が入力を待っているかどうかを判断する方法の例を見つけようとして、私は周りをチェックしました。私が見つけた 1 つの例では strace ( http://www.perlmonks.org/?node_id=964971 ) を使用していましたが、それは私がやろうとしていることに対して複雑すぎるように感じます。
私を導くためのリンクは大歓迎です。