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