我有一段perl代码大致类似于
my $pid = open(PIPE, '-|');
die "Unable to fork: $!\n" if !defined $pid;
if ($pid == 0)
{
open STDERR, '>&STDOUT' or die "Can't redirect STDERR to STDOUT\n";
exec(@cmd);
die "Unexpected exec failure: $!\n";
}
my @lines = (<PIPE>);
close PIPE;
if ($? != 0) { do stuff; }
然而,由于我无法理解的原因,可能与被称为不存在的实际程序有关,有时这无法从$?
@lines
按预期包含“意外的exec失败:文件或目录不存在”(以及$SIG{__DIE__}
处理程序的一些其他输出),但$?
设置为0。我现在正在解决这个问题,同时检查close
的返回值,幸运的是设置为1.但我的错误代码在哪里?
答案 0 :(得分:1)
我不知道。它不应该发生。您可以使用以下代码:
use IPC::Open qw( open3 );
my $pid = open3(local *PIPE, '>&STDOUT', undef, @cmd);
while (<PIPE>) {
...
}
waitpid($pid, 0);
奖励:启动子项时发生的错误(例如,重复错误或来自exec
)会在父中引发异常,因此它看起来不像命令跑了并返回了一个错误。
答案 1 :(得分:0)
好吧,我发现它是什么。
有人在库中添加了一个END{}
块,它正在破坏返回代码(通过调用系统并因此销毁$?)。我退出了改变,一切都很开心。