gpt4 book ai didi

perl - IPC::Open3 并确定 child 是否正在等待输入

转载 作者:行者123 更新时间:2023-12-01 13:39:30 26 4
gpt4 key购买 nike

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
}

上面的代码是我正在编写的脚本的一部分,它需要运行另一个脚本(称为子脚本)。 child 可能会或可能不会提示输入,这取决于/var/tmp 中是否存在 cookie 文件(这两个脚本都是在 CentOS5/perl 5.8.8 上编写的)

我需要确定 child 是否以及何时等待输入,以便 parent 可以从 parent 的 STDIN 传递输入。我还需要使用 open3 打开子进程,因为我需要父进程通过 Perl::Critic 的残酷(严重性 1)检查。

我包含了评论,因为当 cookie 文件已经设置时,我至少可以让 parent 正确地调用 child ,因为在这种情况下 child 不会等待输入。

我四处查看,试图找到有关如何确定 child 是否正在等待输入的示例。我发现的一个例子使用了 strace ( http://www.perlmonks.org/?node_id=964971 ),我觉得这对我想做的事情来说可能太复杂了。

任何指导我的链接将不胜感激。

最佳答案

您可以检查管道中是否有空间(使用 select )。您甚至可以检查管道中有多少可用空间。但是,我从来没有听说过检查线程是否被阻塞等待从管道读取的能力。我认为您应该探索其他途径。


在我看来,一个仅在满足与参数无关的某些条件时才从 STDIN 读取的程序会提供一个提示,表明它正在等待输入。如果是这样的话,可以使用 Expect启动和控制子程序。

但最简单的解决方案是无条件地将数据写入 STDIN。使用 IPC::Open3 实现这个非常复杂[1],所以我建议切换到 IPC::Run3 (更简单)或 IPC::Run (更灵活)。

# Capture's child's STDERR
run3 [ $prog, @args ], \$text_for_stdin, \my $text_from_stdout, \my $text_from_stderr;

# Inherits parent's STDERR
run3 [ $prog, @args ], \$text_for_stdin, \my $text_from_stdout;

  1. 当您同时写入子项的 STDIN 并从子项的 STDOUT 读取时,您需要使用 select(或其他方式)来避免死锁。 IPC::Open3 级别非常低,不会为您执行此操作,而处理这些是 IPC::Run3 和 IPC::Run raison d'être。

关于perl - IPC::Open3 并确定 child 是否正在等待输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41454627/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com