为什么我的fork / exec和close正在丢失来自孩子

时间:2016-09-07 09:03:55

标签: perl fork exec

我有一段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.但我的错误代码在哪里?

2 个答案:

答案 0 :(得分:1)

我不知道。它不应该发生。您可以使用以下代码:

use IPC::Open qw( open3 );

my $pid = open3(local *PIPE, '>&STDOUT', undef, @cmd);
while (<PIPE>) {
   ...
}

waitpid($pid, 0);

奖励:启动子项时发生的错误(例如,重复错误或来自exec)会在中引发异常,因此它看起来不像命令跑了并返回了一个错误。

答案 1 :(得分:0)

好吧,我发现它是什么。

有人在库中添加了一个END{}块,它正在破坏返回代码(通过调用系统并因此销毁$?)。我退出了改变,一切都很开心。