Извлечение информации из $?

Можете ли вы предоставить хорошее объяснение следующего фрагмента кода perl. Я получил некоторую идею от google, но все еще есть много путаницы. отличная помощь, если вы можете предоставить небольшие заметки на нем

$exit_value  = $? >> 8;
$signal_num  = $? & 127;
$dumped_core = $? & 128;

Ответ 1

Цитата Док:

$

Статус, возвращаемый последней закрывающейся трубкой, команда backtick (``) успешный вызов wait() или waitpid() или из оператора system(). Это всего лишь 16-битное слово состояния, возвращаемое традиционным Unix wait() (иначе он составлен, чтобы выглядеть так). Таким образом значение выхода подпроцесса действительно ($? → 8) и $? и 127 дает какой сигнал, если таковой имеется, сработал, и $? и 128 отчетов был ли основной дамп.

>> 8 дает старший байт 16-битного слова.

& 127 по существу совпадает с & 0b01111111, выдавая нижнюю 7-битную часть этого слова.

& 128 совпадает с & 0b10000000, который в основном проверяет 8-й бит результата.

Ответ 2

См. perldoc -f system:

if ($? == -1) {
    print "failed to execute: $!\n";
}
elsif ($? & 127) {
    printf "child died with signal %d, %s coredump\n",
        ($? & 127),  ($? & 128) ? 'with' : 'without';
}
else {
    printf "child exited with value %d\n", $? >> 8;
}

Семантика $? взята из системного вызова wait, см. man 2 wait.

Ответ 3

use POSIX qw( WEXITSTATUS WIFEXITED );

if( WIFEXITED($?) ) {
    print "The exit status was ", WEXITSTATUS($?), "\n";
}

См. также WIFSIGNALED и WTERMSIG.

Еще один полезный макрос C WCOREDUMP, задокументированный в библиотеке GNU C как (с дополнительным акцентом)

WCOREDUMP(status)

возвращает значение true, если дочерний элемент создавал дамп ядра. Этот макрос должен использоваться только в том случае, если WIFSIGNALED верен. Этот макрос не указан в POSIX.1-2001 и недоступен в некоторых реализациях Unix (например, AIX, SunOS). Используйте это только в #ifdef WCOREDUMP & hellip; #endif.

Поскольку версия 5.10.0, perl включает WCOREDUMP при вычислении значения $?, если макрос доступен в вашей системе, как описано в perlvar:

Таким образом, значение выхода подпроцесса действительно ($?>> 8), а $? & 127 указывает, какой сигнал, если таковой имеется, сработал, и $? & 128 сообщает, был ли ядро ​​ядра.