Почему код выхода 255 вместо-1 в Perl?

Почему это - это, когда я смещаю код выхода, $?, в Perl восемь, я добираюсь 255, когда я ожидаю, что это будет-1?

7
задан brian d foy 28 April 2010 в 03:50
поделиться

3 ответа

Статус выхода, возвращаемый функцией '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;

См. Также SO 774048 и SO 179565 .

20
ответ дан 6 December 2019 в 06:02
поделиться

В какую сторону вы это передвигаете? Приведите пример кода.

также:

perldoc -f system

дает очень простой для понимания пример того, что делать с $?

Кроме того, http://www.gnu.org/s/libc/manual/html_node/Exit- Status.html

Значения выхода должны быть от 0 до 255. Ваш сдвиг в сочетании с тем, как на самом деле компьютер сохраняет отрицательные значения, должен дать некоторое представление.

0
ответ дан 6 December 2019 в 06:02
поделиться

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.

Здесь нет специальной обработки для отрицательных чисел в коде выхода. .

10
ответ дан 6 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: