Каков допустимый диапазон для возвращаемого значения программы в 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 бит. Вы не можете переносить больше, чем это. (И я не знаю системных зависимых методов, чтобы получить больше либо.)