2013-12-06 2 views
0

Простой вопрос, но я не могу найти хороший ответ - здесь идет с примером:статус Выход ребенка породил в трубе

«world.pl» нерестится «hello.pl» в детстве и обрабатывает его стандартный вывод. «world.pl» должен знать статус выхода «hello.pl». Выполнение системного вызова не является вариантом, так как «world.pl» необходимо обработать стандартное «hello.pl». Я также пытаюсь избежать fork(). Вопрос: Как «world.pl» может найти статус выхода «hello.pl»? Используя perl v5.12.4 на Дарвине, если это имеет значение. Спасибо заранее, - М.

#!/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; 
+0

Попробуйте RUN3: http://search.cpan.org/~rjbs/IPC-Run3-0.046/lib/IPC/Run3.pm – ceving

+0

'Выход 1, если ($ # ARGV <0); 'можно написать' exit 1 if! @ARGV; ' – ikegami

ответ

4
my $status = $?; 

Но вы не сможете следить с

exit $status; 

, потому что число будет слишком большим. Я видел, как люди делают следующее, но это означает успех для некоторых неудач.

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

Я рекомендую, что bash делает:

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

Кстати, вы не правильно построить команду оболочки.

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

Либо использовать Струнный :: ShellQuote или использовать несколько формы ARG из open |-.

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

С исправлением:

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

Благодарим вас за синтаксические рекомендации bash, но они не отвечают на мой вопрос. Позвольте мне перефразировать: «Как родительский элемент Perl может фильтровать стандартную версию своего дочернего элемента так долго, как только он доступен, и проверить статус этого ребенка после его выхода»? –

+0

Да, да. 'my $ status = $ ?;' – ikegami

+0

Замечательно, это ответ, который я ищу. Еще раз спасибо, М. –

Смежные вопросы