在管道中产生的孩子的退出状态

时间:2013-12-06 19:14:25

标签: perl

简单的问题,但我找不到一个好的答案 - 这里有一个例子:

“world.pl”在子节点中生成“hello.pl”并处理其标准输出。 “world.pl”需要知道“hello.pl”的退出状态。进行系统调用不是一种选择,因为“world.pl”需要处理“hello.pl”的标准输出。我也试图避免fork()。问题:“world.pl”如何找到“hello.pl”的退出状态?如果重要的话,在达尔文上使用perl v5.12.4。提前谢谢, - M。

#!/opt/local/bin/perl -w
## hello.pl <name> [more names]
exit 1 if ($#ARGV < 0);
foreach (@ARGV) { print "Hello, $_\n" }
exit 0;

另一部分......

#!/opt/local/bin/perl -w
## world.pl name [more names ...]
open (FP, "./hello.pl @ARGV |") or die "$0: Cannot open pipe: $!\n";
while (<FP>) { print }
close FP;
my $status = 0; # Want this to be exit status of the process "hello.pl"
exit $status;

1 个答案:

答案 0 :(得分:4)

my $status = $?;

但是你无法跟进

exit $status;

因为数字太大了。我见过人们做了以下事情,但它标志着一些失败的成功。

exit( $status >> 8 );   # XXX BAD!

我建议bash做什么:

exit( ($status & 0x7F) ? ($status & 0x7F) | 0x80 : $status >> 8 );

顺便说一句,您无法正确构建shell命令。

$ world.pl 'von Perl' meow
Hello, von
Hello, Perl
Hello, meow

使用String :: ShellQuote或使用open |-的多个arg形式。

open (FP, '|-', './hello.pl', @ARGV) 

使用修复:

$ world.pl 'von Perl' Meow
Hello, von Perl
Hello, Meow