Почему это - это, когда я смещаю код выхода, $?, в Perl восемь, я добираюсь 255, когда я ожидаю, что это будет-1?
Статус выхода, возвращаемый функцией 'wait ()', является 16-битным значением. Из этих 16 битов 8 старших битов берутся из 8 младших битов значения, возвращаемого функцией exit () - или значения, возвращаемого функцией main ()
. Если программа умирает естественным образом, все младшие 8 бит из 16 равны нулю. Если программа умирает из-за сигнала, младшие 8 бит кодируют номер сигнала и бит, указывающий, произошел ли дамп памяти. С сигналом статус выхода рассматривается как нулевой - программы, подобные оболочке, обычно интерпретируют ненулевые биты младшего разряда как сбой.
15 8 7 0 Bit Position
+-----------------+
| exit | signal |
+-----------------+
Большинство машин фактически хранят 16-битное значение в 32-битном целом числе, и это обрабатывается с помощью беззнаковой арифметики. 8 битов более высокого порядка из 16 могут быть все 1, если процесс завершился с 'exit (-1)', но это будет отображаться как 255 при сдвиге вправо на 8 бит.
Если вы действительно хотите преобразовать значение в число со знаком, вам придется немного изменить бит на основе 16-го бита.
$status >>= 8;
($status & 0x80) ? -(0x100 - ($status & 0xFF)) : $status;
В какую сторону вы это передвигаете? Приведите пример кода.
также:
perldoc -f system
дает очень простой для понимания пример того, что делать с $?
Кроме того, http://www.gnu.org/s/libc/manual/html_node/Exit- Status.html
Значения выхода должны быть от 0 до 255. Ваш сдвиг в сочетании с тем, как на самом деле компьютер сохраняет отрицательные значения, должен дать некоторое представление.
Perl возвращает код выхода из подпроцесса таким же образом, как макрос библиотеки времени выполнения C WEXITSTATUS
, описание которого приведено в ] wait (2)
:
WEXITSTATUS(status) evaluates to the least significant eight bits of the return code of the child which terminated, which may have been set as the argument to a call to exit() or as the argument for a return statement in the main program. This macro can only be evaluated if WIFEXITED returned non-zero.
Важной частью здесь являются младшие восемь битов . Вот почему вы получаете код выхода 255. На странице руководства perlvar
$?
описывается следующее:
$? The status returned by the last pipe close, backtick (‘‘) com- mand, successful call to wait() or waitpid(), or from the sys- tem() operator. This is just the 16-bit status word returned by the wait() system call (or else is made up to look like it). Thus, the exit value of the subprocess is really ("$? >> 8"), and "$? & 127" gives which signal, if any, the process died from, and "$? & 128" reports whether there was a core dump.
Здесь нет специальной обработки для отрицательных чисел в коде выхода. .