Описание тега churchill
Количество переданного для _exit()
/exit_group()
системный вызов (иногда упоминается как код выхода , чтобы избежать двусмысленности с статус выхода , который также со ссылкой на кодировку либо код выхода или сигнала, количество и дополнительную информацию в зависимости от того, процесс был убит или вышел нормально) имеет тип инт
, так что на UNIX-подобных системах, как Linux, как правило, 32-разрядный целочисленный со значениями в диапазоне от -2147483648 до (-231) до 2147483647 (231-1).
Однако, на всех системах, когда родительский процесс (или ребенок сборщик или инициализации
если родитель умер) использует ожидания()
, с помощью waitpid()
, wait3()
, wait4()
системный вызов, чтобы получить его, только нижние 8 бит из него доступны (значения от 0 до 255 (28-1)).
При использовании waitid()
API (или сигнал обработчик сигнала sigchld), в большинстве систем (и как POSIX теперь более четко требует в 2016 издание стандарта (см. Для _exit()
спецификация)), полный номер (в si_status
поля возвращаемой структуры). Что не так в Linux, но которые также усекает число до 8 бит с waitid()
API, хотя это может измениться в будущем.
Как правило, вы хотите использовать только значения 0 (в общем смысле успеха) до 125 только, как многие снаряды использовать значения выше 128 в $?
представительство статус выхода для кодирования сигнала номером процесса были убиты и 126 и 127 на специальных условиях.
Вы можете использовать 126 до 255 на выходе()
означает то же самое, что они делают для оболочки $?
(например, когда скрипт делает рэт=$?; ...; выход "$рет"
). Используя значения вне 0 -> 255-это вообще не полезно. Ты вообще только и делают, что, если вы знаете, родитель будет использовать waitid()
API на системах, которые не усекают и у вас есть потребность в 32-битном диапазоне значений. Обратите внимание, что если вы делаете выход(2048)
например, что будет расценено как успех родителей с использованием традиционных ждать*()
API-интерфейсы.
Более подробная информация:
Что вопросы и ответы должны надеюсь ответить на большинство ваших вопросов и разъяснить, что означают статус выхода. Я добавлю еще несколько вещей:
Процесс не может завершиться, если он убил или вызывает для _exit()
/exit_group()
системные вызовы. При возврате из функции main()
в языке C
, то libc вызовов системы вызова с возвращенным значением.
Большинство языков имеют выход()
функция, которая оборачивает, что системный вызов и стоимость они берут, если таковые вообще прошел как системному вызову. (обратите внимание, что те, как правило, делать больше вещей, как очистка сделано с Выход()
функция, которая сбрасывает с stdio буферов, работает в atexit()
крючки...)
Это дело, по крайней мере:
$ трассированием -е exit_group на awk 'начало{выход(1234)}'
exit_group(1234) = ?
$ трассированием -е exit_group mawk 'начало{выход(1234)}'
exit_group(1234) = ?
$ трассированием -е exit_group busybox и на awk 'начало{выход(1234)}'
exit_group(1234) = ?
$ Эхо | трассированием -е exit_group СЭД 'Q1234'
exit_group(1234) = ?
$ трассированием -е выхода exit_group на Perl -е '(1234)'
exit_group(1234) = ?
$ трассированием -е exit_group питон -с выходом '(1234)'
exit_group(1234) = ?
$ трассированием -е exit_group ждем-с выхода '1234'
exit_group(1234) = ?
$ трассированием -е exit_group РНР -Р 'выход(1234);'
exit_group(1234) = ?
$ трассированием -е выхода exit_group ЗШ -с '1234'
exit_group(1234)
Вы изредка увидите некоторые жалуются, что, когда вы используете значение за пределами 0-255:
m4exit $ Эхо '(1234)' | трассированием -е exit_group М4
М4:как stdin:1: состояние выхода из диапазона: `1234'
exit_group(1) = ?
Некоторые снаряды жаловаться, когда вы используйте отрицательное значение:
$ трассированием -е exit_group черточки -с 'Выход -1234'
тире: 1: выход: незаконное номер: -1234
exit_group(2) = ?
$ трассированием -е exit_group Яш -с 'Выход -- -1234'
выход: `-1234' не является допустимым целым числом
exit_group(2) = ?
POSIX оставляет поведение неопределено, если значение, передаваемое выход
специальные встроенные вне 0->255.
Некоторые снаряды показывают какие-то неожиданные поведения если у вас:
Баш
(иМКШ
, но небеспроводным интерфейсам,
на которых она основана) принимает на себя усечь значение в 8 бит:$ трассированием -е exit_group Баш-с выходом '1234' exit_group(210) = ?
Так что в эти снаряды, если вы хотите, чтобы выйти со значением за пределами 0-255, вы должны сделать что-то вроде:
старпома ЗШ -с 'Выход -- -12345' старпома на Perl -е 'выход(-12345)'
Это выполняется другая команда в тот же процесс, Что может вызвать системный вызов с значение, которое вы хотите.
как уже упоминалось в, что другие вопросы,
ksh93
странное поведение для выхода значений от 257 до 256+max_signal_number, где вместо вызоваexit_group()
, он убивает себя с соответствующим сигнала1.$ КШ-C 'на выход "$((256 + $(убить -я остановка)))"' ЗШ: подвесные (сигнал) КШ-с выходом '"$((256 + $(убить -я остановка)))"'
а в противном случае усекает число, как
Баш
/МКШ
.
1 Это, вероятно, изменится в следующей версии. Теперь, что развитие ksh93
был захвачен в качестве сообщества усилия вне АТ&Т, что поведение, хоть как-то поощрять в POSIX, в настоящее время отменены