希望从通过Perl中的open执行的命令中获取模具错误消息
我正在尝试出一个cmd,如下所示希望从通过Perl中的open执行的命令中获取模具错误消息,perl,perltk,Perl,Perltk,我正在尝试出一个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
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在
文本小部件
不知何故,即使在测试小部件中,我也没有收到死亡消息。
我在电视上看到了
2个问题
$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()
调用之后一样。因此,对于非零退出代码,您知道该命令已终止或退出时的值为假。谢谢Slaven。我正在将错误消息发送到文本小部件。我的cmd错误是有一个“T”,所以stderr已经被过滤了。但是我得到了retcode=0。我会做更多的研究。管道的返回值来自链中的最后一个命令。比较false;echo$?
vs.false | tee;echo$?