1

我正在尝试分叉出如下所示的 cmd

my $h = IO::Handle->new;
$self->{-handle} = $h;

die "IO::Handle->new failed." unless defined $h;
$self->{-pid} = open $h, $self->{-command} . ' 2>&1 |';
$self->fileevent($h, 'readable' => [\&_read_cmd_op, $self]);

sub _read_cmd_op{
    my $h = $self->{-handle};
    if ( sysread $h, $_, 4096 ) {
        my $t = $self->Subwidget('text');
        $t->insert('end', $_);
        $t->yview('end');
    } else {
        $self->{-finish} = 1;
    }
}

现在的问题是'$self{-command}' 正在调用另一个perl 脚本,如果死了我想知道。

请注意,即使 cmd 死了, $self{-pid} 仍然存在。

上面的代码在一个 Perl/TK 应用程序中,其中 $self->{-command} o/p 在文本小部件中捕获。

不知何故,即使在测试小部件中,我也没有收到 die 消息。我在标准输出上看到它。

2个问题

  1. 如何在文本小部件中获取 cmd 操作/错误?

  2. 我怎么知道通过 IO::Handle 触发的命令死了?

4

1 回答 1

1

$self->{-pid}只是分叉进程的 pid,而不是命令退出时消失的魔法对象。

我无法重现未收到die()消息的问题。如果上面的代码片段是用 调用的'perl -e "die 123"',那么“123”会出现在文本小部件中(至少在 Unix 系统上)。

要获取退出代码,您可以使用以下内容。

} else {
    $mw->fileevent($h, 'readable', '');
    my $pid = waitpid($self->{-pid},0);
    warn "pid $pid finished";
    warn "retcode is " . ($? >> 8);
    $self->{-finish} = 1;
}

带有空回调的fileevent调用将停止对该文件句柄的进一步选择。使用 waitpid 调用,您可以等待子进程的终止。一旦发生这种情况,退出代码就在$?变量中可用,就像在正常system()调用之后一样。因此,对于非零退出代码,您知道该命令已终止或以错误值退出。

于 2014-04-03T18:47:05.977 回答