Извлечение информации из $? - PullRequest
10 голосов
/ 01 марта 2012

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

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

Ответы [ 3 ]

12 голосов
/ 01 марта 2012

Цитирование Документ :

$

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

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

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

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

6 голосов
/ 01 марта 2012

См. 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.

2 голосов
/ 05 марта 2012
use POSIX qw( WEXITSTATUS WIFEXITED );

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

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

Другим полезным макросом C является WCOREDUMP, задокументированов библиотеке GNU C as (с дополнительным выделением)

WCOREDUMP(status)

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...