我正在尝试挖出像下面的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 in a 文本小部件。
不知怎的,即使在测试小部件中我也没有得到消息。 我在stdout上看到它。
2个问题
如何在文本小部件中获取cmd op / error?
我怎么知道通过IO :: Handle发出的命令死了?
答案 0 :(得分: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()
调用之后。因此,对于非零退出代码,您知道命令以虚假值死亡或退出。