Каков допустимый диапазон для возвращаемого значения программы в Linux/bash?

У меня есть программа на C, которая возвращает целочисленное значение. Я был удивлен, узнав, что при рассмотрении возвращаемого значения из командной строки я получаю значение по модулю 256.

/* prog.c */
int main(...) { return 257; }

-

> ./prog.e
> echo $?  
1
  • Почему я не вижу целое число?
  • Где такое поведение задокументировано?
  • Как я могу получить все 32-битное значение для оболочки?

Ответ 1

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

http://www.gnu.org/s/hello/manual/libc/Exit-Status.html

в качестве альтернативы:

http://en.wikipedia.org/wiki/Exit_status

пришли из "кодов возврата posix" и "c кодов возврата" соответствующих поисковых запросов Google.

Ответ 2

Объяснение находится в верхней части man exit:

   The  exit() function causes normal process termination and the value of
   status & 0377 is returned to the parent (see wait(2)).

Другими словами, только младшие 8 бит распространяются на родительский процесс.

В этом отношении возврат кода выхода из main() ничем не отличается от передачи его в exit().

Ответ 3

Состояние возврата объясняется (вроде) в wait и связанных с ним системных вызовах.

В принципе:

WEXITSTATUS (stat_val)
Если значение WIFEXITED (stat_val) не равно нулю, этот макрос оценивает младшие 8 бит аргумента состояния, которые дочерний процесс передал _exit() или exit(), или значение дочернего процесса, возвращаемого из main().

Таким образом, он ограничивается 8 бит. Вы не можете переносить больше, чем это. (И я не знаю системных зависимых методов, чтобы получить больше либо.)