Номер передается _exit()
/ exit_group()
системного вызова (иногда называемый как код завершения , чтобы избежать неоднозначности с статусом выхода , который также со ссылкой на кодирование либо кода выхода или номер сигнала и дополнительной информации в зависимости от того, был ли процесс убит или вышли нормально ) имеет тип int
, поэтому в Unix-подобных системах, таких как Linux, обычно это 32-битное целое число со значениями от -2147483648 (-2 31 ) до 2147483647 (2 31 -1).
Тем не менее, на все системы, когда (ребенок subreaper или или родительский процесс , init
если родитель умер) использует wait()
, waitpid()
, wait3()
, wait4()
системные вызовы , чтобы получить его, только младшие 8 бит него доступно (значение от 0 до 255 (2 8 - 1)).
При использовании waitid()
API (или обработчика сигнала в SIGCHLD) в большинстве систем (и, как теперь более четко требуется в POSIX в редакции стандарта 2016 года (см. _exit()
Спецификацию )), доступен полный номер (в si_status
поле возвращаемой структуры ). Это не относится к Linux, хотя он также усекает число до 8 бит с помощью waitid()
API, хотя это может измениться в будущем.
Как правило, вы хотите использовать только значения от 0 (обычно означающие успех) до 125, так как многие оболочки используют значения выше 128 в своем $?
представлении состояния выхода для кодирования номера сигнала уничтожаемого процесса и 126 и 127 для специальных условия.
Возможно, вы захотите использовать 126–255 exit()
для обозначения того же, что и для оболочки $?
(например, для сценария ret=$?; ...; exit "$ret"
). Использование значений вне 0 -> 255 обычно бесполезно. Как правило, вы делаете это только в том случае, если знаете, что родитель будет использовать waitid()
API в системах, которые не усекаются, и вам необходим 32-битный диапазон значений. Обратите внимание, что если вы сделаете, exit(2048)
например, это будет восприниматься родителями как успешное использование традиционных wait*()
API.
Больше информации на:
Надеемся, что эти вопросы и ответы должны ответить на большинство других ваших вопросов и уточнить, что подразумевается под статусом выхода . Я добавлю еще несколько вещей:
Процесс не может быть прекращено , если он не убил или вызывает _exit()
/ exit_group()
системные вызовы. Когда вы возвращаетесь из main()
in C
, libc вызывает этот системный вызов с возвращаемым значением.
Большинство языков имеют exit()
функцию, которая переносит этот системный вызов, и значение, которое они принимают, если оно вообще передается системному вызову. (обратите внимание, что они обычно делают больше вещей, таких как очистка, выполняемая exit()
функцией C, которая очищает буферы stdio, запускает atexit()
ловушки ...)
Это случай по крайней мере:
$ strace -e exit_group awk 'BEGIN{exit(1234)}'
exit_group(1234) = ?
$ strace -e exit_group mawk 'BEGIN{exit(1234)}'
exit_group(1234) = ?
$ strace -e exit_group busybox awk 'BEGIN{exit(1234)}'
exit_group(1234) = ?
$ echo | strace -e exit_group sed 'Q1234'
exit_group(1234) = ?
$ strace -e exit_group perl -e 'exit(1234)'
exit_group(1234) = ?
$ strace -e exit_group python -c 'exit(1234)'
exit_group(1234) = ?
$ strace -e exit_group expect -c 'exit 1234'
exit_group(1234) = ?
$ strace -e exit_group php -r 'exit(1234);'
exit_group(1234) = ?
$ strace -e exit_group zsh -c 'exit 1234'
exit_group(1234)
Иногда вы видите, что жалуются, когда вы используете значение за пределами 0-255:
$ echo 'm4exit(1234)' | strace -e exit_group m4
m4:stdin:1: exit status out of range: `1234'
exit_group(1) = ?
Некоторые оболочки жалуются, когда вы используете отрицательное значение:
$ strace -e exit_group dash -c 'exit -1234'
dash: 1: exit: Illegal number: -1234
exit_group(2) = ?
$ strace -e exit_group yash -c 'exit -- -1234'
exit: `-1234' is not a valid integer
exit_group(2) = ?
POSIX оставляет поведение неопределенным, если значение, переданное exit
специальной встроенной функции, находится вне 0-> 255.
Некоторые оболочки показывают неожиданное поведение, если вы делаете:
bash
(и mksh
не pdksh
на чем он основан) берет на себя усечение значения до 8 бит:
$ strace -e exit_group bash -c 'exit 1234'
exit_group(210) = ?
Так что в этих оболочках, если вы хотите выйти со значением вне 0-255, вы должны сделать что-то вроде:
exec zsh -c 'exit -- -12345'
exec perl -e 'exit(-12345)'
То есть выполните в этом же процессе другую команду, которая может вызвать системный вызов со значением, которое вы хотите.
как упоминалось в этом другом Q & A, ksh93
имеет самое странное поведение для значений выхода от 257 до 256 + max_signal_number, где вместо вызова exit_group()
он убивает себя соответствующим сигналом¹.
$ ksh -c 'exit "$((256 + $(kill -l STOP)))"'
zsh: suspended (signal) ksh -c 'exit "$((256 + $(kill -l STOP)))"'
и иначе усекает число как bash
/ mksh
.
Likely Это, вероятно, изменится в следующей версии. Теперь, когда разработка ksh93
была предпринята как усилие сообщества за пределами AT & T, это поведение, хотя и поощряемое каким-либо образом POSIX, возвращается
return
, Конечно же , встроенная команда оболочки.