Извлечение информации из $?
Можете ли вы предоставить хорошее объяснение следующего фрагмента кода 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
сообщает, был ли ядро ядра.