【发布时间】:2017-01-04 00:54:29
【问题描述】:
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 传递输入。我还需要使用 open3 打开子进程,因为我需要父进程通过 Perl::Critic 的残酷(严重性 1)检查。
我包含了 cmets,因为当 cookie 文件已经设置时,我至少可以让父级正确调用子级,因为在这种情况下子级不会等待输入。
我已经四处寻找有关如何确定孩子是否在等待输入的示例。我发现的一个例子使用了 strace (http://www.perlmonks.org/?node_id=964971),我觉得这对于我想做的事情来说可能太复杂了。
任何指导我的链接将不胜感激。
【问题讨论】:
-
您可以检查管道中是否有空间(使用
select),但我从未听说过能够检查线程是否阻塞等待从管道读取。 -
子进程在从 STDIN 读取之前是否发出提示?
-
有什么理由不无条件通过输入?
-
除了没有任何理由之外,没有。有提示
-
那么只需提供输入而无需检查。不过,请使用 IPC::Run3 或 IPC::Run 而不是使用 IPC::Open3+IO::Select。后者太复杂了。 (如果你在这里没有使用
select和open3,你就做错了。)另一种选择是使用Expect 来驱动孩子,但这只是针线活。