В вычислительной технике статус выхода (также код выхода или значение выхода ) завершенного процесса — это целое число, которое становится доступным его родительскому процессу (или вызывающему). В DOS это может называться errorlevel .
При выполнении компьютерных программ операционная система создает абстрактную сущность , называемую процессом , в которой ведется учет для этой программы. В многозадачных операционных системах, таких как Unix или Linux , новые процессы могут создаваться активными процессами. Процесс, который порождает другой, называется родительским процессом , в то время как созданные им процессы являются дочерними . Дочерние процессы выполняются одновременно с родительским процессом. Методика порождения дочерних процессов используется для делегирования некоторой работы дочернему процессу, когда нет причин останавливать выполнение родительского процесса. Когда дочерний процесс завершает выполнение, он завершает работу, вызывая системный вызов exit . Этот системный вызов упрощает передачу кода статуса завершения обратно родительскому процессу, который может получить это значение с помощью системного вызова wait .
Родитель и потомок могут иметь понимание о значении статусов выхода. Например, это обычная практика программирования, когда дочерний процесс возвращает (выходит) ноль родительскому процессу, что означает успешное завершение. Помимо этого возвращаемого дочерним процессом значения, родительскому процессу может быть доступна и другая информация, например, как процесс завершился, как обычно, так и по сигналу .
Конкретный набор возвращаемых кодов уникален для программы, которая его устанавливает. Обычно он указывает на успех или неудачу. Значение кода, возвращаемого функцией или программой, может указывать на конкретную причину неудачи. Во многих системах чем выше значение, тем серьезнее причина ошибки. [1] В качестве альтернативы каждый бит может указывать на другое состояние, при этом они оцениваются оператором or вместе, чтобы дать окончательное значение; например, fsck делает это.
Иногда, если коды разработаны с этой целью, их можно использовать непосредственно в качестве индекса ветвления при возврате в инициирующую программу, чтобы избежать дополнительных проверок.
В AmigaOS , MorphOS и AROS определены четыре уровня:
Скрипты оболочки обычно выполняют команды и фиксируют их статусы завершения.
Для целей оболочки команда, которая завершается с нулевым статусом выхода, считается успешно выполненной. Ненулевой статус выхода указывает на сбой. Эта, казалось бы, нелогичная схема используется, поэтому существует один четко определенный способ указать на успех и множество способов указать на различные режимы сбоя. Когда команда завершается сигналом с номером N, оболочка устанавливает переменную $? в значение больше 128. Большинство оболочек используют 128+N, в то время как ksh93 использует 256+N.
Если команда не найдена, оболочка должна вернуть статус 127. Если команда найдена, но не может быть выполнена, возвращаемый статус должен быть 126. [2] Обратите внимание, что это относится не ко всем оболочкам.
Если команда не выполняется из-за ошибки во время расширения или перенаправления, статус выхода больше нуля.
Язык программирования C позволяет программам, выходящим из основной функции или возвращающимся из нее , сообщать об успехе или неудаче, возвращая целое число или возвращая макросы EXIT_SUCCESS
и EXIT_FAILURE
. В Unix-подобных системах они равны 0 и 1 соответственно. [3] Программа на языке C также может использовать exit()
функцию, указав в качестве первого параметра целочисленный статус или макрос выхода.
Возвращаемое значение main
передается функции exit
, которая для значений ноль EXIT_SUCCESS
или EXIT_FAILURE
может преобразовать его в «определенную реализацией форму» успешного завершения или неуспешного завершения . [ необходима цитата ]
За исключением нуля и макросов EXIT_SUCCESS
и EXIT_FAILURE
, стандарт C не определяет значение кодов возврата. Правила использования кодов возврата различаются на разных платформах (см. разделы, специфичные для платформ).
В терминологии DOS errorlevel — это целочисленный код выхода , возвращаемый исполняемой программой или подпрограммой . Обычно Errorlevel находится в диапазоне от 0 до 255. [4] [5] [6] [7] В DOS доступно только 256 кодов ошибок, но DR DOS 6.0 и выше поддерживают 16-битные коды ошибок по крайней мере в CONFIG.SYS . [6] В 4DOS и DR-DOS COMMAND.COM коды выхода (в пакетных заданиях) можно задать с помощью EXIT n [6] и (в CONFIG.SYS) через ERROR= n . [6]
Статусы выхода часто захватываются пакетными программами с помощью команд IF ERRORLEVEL . [4] [6] Многопользовательский DOS поддерживает зарезервированную переменную окружения %ERRORLVL% , которая автоматически обновляется при возврате из приложений. COMMAND.COM в DR-DOS 7.02 и выше поддерживает похожую псевдопеременную окружения %ERRORLVL%, а также %ERRORLEVEL% . В CONFIG.SYS DR DOS 6.0 и выше поддерживает ONERROR для проверки состояния загрузки и кода возврата драйверов устройств и кода выхода программ. [6]
В Java любой метод может вызвать System.exit(int status)
, если только менеджер безопасности не разрешит это. Это завершит текущую работу виртуальной машины Java. "Аргумент служит кодом состояния; по соглашению, ненулевой код состояния указывает на ненормальное завершение." [8]
В OpenVMS успех обозначается нечетными значениями, а неудача — четными. Значение представляет собой 32-битное целое число с подполями: биты управления, номер объекта, номер сообщения и серьезность. Значения серьезности делятся на успех (Успех, Информационное) и неудачу (Предупреждение, Ошибка, Фатальное). [9]
В языке C Plan 9 статус выхода указывается строкой, передаваемой функции exits , а функция main имеет тип void .
В Unix и других POSIX-совместимых системах родительский процесс может получить статус завершения дочернего процесса, используя wait()
семейство системных вызовов, определенных в wait.h. [10] Из них вызов waitid()
[11] получает полный статус завершения, но более старые вызовы wait()
и waitpid()
[12] получают только наименее значимые 8 бит статуса завершения.
Интерфейсы wait()
и waitpid()
устанавливают значение статуса типа, int
упакованного как битовое поле с различными типами информации о завершении дочернего процесса. Если дочерний процесс завершился выходом (что определяется макросом WIFEXITED()
; обычной альтернативой является то, что он умер из-за неперехваченного сигнала ), SUS указывает, что младшие 8 бит статуса выхода могут быть извлечены из значения статуса с помощью WEXITSTATUS()
макроса.
В waitid()
системном вызове (добавленном с SUSv1) статус выхода дочернего процесса и другая информация больше не находятся в битовом поле, а в структуре типа siginfo_t
. [13]
Системы, совместимые с POSIX, обычно используют соглашение о том, что ноль означает успех, а не ноль — ошибку. [14] Были разработаны некоторые соглашения относительно относительных значений различных кодов ошибок; например, GNU рекомендует, чтобы коды с высоким набором битов были зарезервированы для серьезных ошибок. [3]
Операционные системы, основанные на BSD, определили обширный набор предпочтительных интерпретаций: значения для 15 кодов состояния от 64 до 78 определены в sysexits.h. [15] Они исторически происходят от sendmail и других агентов передачи сообщений , но с тех пор они нашли применение во многих других программах. [16]
В Advanced Bash-Scripting Guide и /usr/include/sysexits.h есть некоторая информация о значении ненулевых кодов статуса выхода. [17]
Microsoft Windows использует 32-битные беззнаковые целые числа в качестве кодов выхода, [18] [19] хотя интерпретатор команд обрабатывает их как знаковые. [20]
На коды выхода ссылается напрямую, например, интерпретатор командной строки CMD.exe в errorlevel
терминологии, унаследованной от DOS . Процессы .NET Framework и Windows PowerShell ссылаются на него как на ExitCode
свойство объекта Process
.
{{cite book}}
: |work=
игнорируется ( помощь ) [1] [2] Архивировано 11.09.2017 в archive.today (Примечание. BATTIPS.TXT является частью MPDOSTIP.ZIP. Предоставленная ссылка указывает на более старую версию файла BATTIPS.TXT, преобразованную в HTML.) [3]{{cite book}}
: |work=
игнорируется ( помощь ) (Примечание. NWDOSTIP.TXT — это всеобъемлющая работа по Novell DOS 7 и OpenDOS 7.01 , включающая описание многих недокументированных функций и внутренних компонентов. Приведенная ссылка указывает на преобразованную в HTML версию файла, которая является частью коллекции MPDOSTIP.ZIP
.) [4]