Почему Perl's $? возвращать неправильное значение для кода завершения разветвленного процесса? - PullRequest
6 голосов
/ 26 мая 2010

Рассмотрим этот тривиальный пример fork () , ожидающего смерти ребенка в Perl:

#!/usr/bin/perl

use strict;
use warnings;

if (fork() == 0) {
        exit(1);
}

waitpid(-1,0);

print $?;

Запустив скрипт на Solaris 10 я получаю такой результат:

$ perl test.pl
256

Я подозреваю, что значения смещаются вверх, потому что когда я делаю exit(2) в дочернем элементе, вывод становится 512.

Я не могу найти это документально в perl waitpid . Это ошибка в моей системе или я что-то не так делаю?

Ответы [ 2 ]

24 голосов
/ 26 мая 2010

Это задокументировано в разделе $? справочной страницы perlvar .

т.е. реальный код выхода - $? >> 8.

2 голосов
/ 19 августа 2016

Ребенок, возможно, даже не успел позвонить exit. Таким образом, $? содержит больше информации, чем просто параметр exit.

if    ( $? == -1  ) { die "Can't launch child: $!\n"; }
elsif ( $? & 0x7F ) { die "Child killed by signal ".( $? & 0x7F )."\n"; }
elsif ( $? >> 8   ) { die "Child exited with error ".( $? >> 8 )."\n"; }
else                { print "Child executed successfully\n"; }

Это более четко задокументировано в документации system.

...