В вычислениях статус завершения или код завершения завершенного процесса представляет собой целое число, которое становится доступным его родительскому процессу (или вызывающему объекту). В DOS это можно назвать уровнем ошибок .
Когда компьютерные программы выполняются, операционная система создает абстрактную сущность , называемую процессом , в котором ведется учет этой программы. В многозадачных операционных системах, таких как Unix или Linux , новые процессы могут создаваться активными процессами. Процесс, порождающий другой, называется родительским процессом , а созданные — дочерними процессами . Дочерние процессы выполняются одновременно с родительским процессом. Техника создания дочерних процессов используется для делегирования некоторой работы дочернему процессу, когда нет причин останавливать выполнение родительского процесса. Когда дочерний процесс завершает выполнение, он завершает работу, вызывая системный вызов выхода . Этот системный вызов облегчает передачу кода состояния выхода обратно родительскому элементу, который может получить это значение с помощью системного вызова ожидания .
Родитель и ребенок могут понять значение статусов выхода. Например, обычной практикой программирования является то, что дочерний процесс возвращает родительскому процессу ноль (завершается с ним), что означает успех. Помимо этого возвращаемого значения дочернего процесса, родительскому процессу также может быть доступна другая информация, например, о том, как процесс завершился, обычно или по сигналу .
Конкретный возвращаемый набор кодов уникален для программы, которая его устанавливает. Обычно это указывает на успех или неудачу. Значение кода, возвращаемого функцией или программой, может указывать на конкретную причину сбоя. Во многих системах, чем выше значение, тем серьезнее причина ошибки. [1] Альтернативно , каждый бит может обозначать различные условия, при этом они оцениваются оператором или вместе для получения окончательного значения; например, это делает fsck .
Иногда, если коды разработаны с этой целью, их можно использовать непосредственно в качестве индекса ветвления при возврате к инициирующей программе, чтобы избежать дополнительных тестов.
В AmigaOS , MorphOS и AROS определены четыре уровня:
Сценарии оболочки обычно выполняют команды и фиксируют их статусы завершения.
Для целей оболочки команда, которая завершается с нулевым статусом завершения, завершилась успешно. Ненулевой статус выхода указывает на сбой. Эта, казалось бы, нелогичная схема используется, поэтому существует один четко определенный способ указать на успех и множество способов указать на различные виды неудач. Когда команда завершается сигналом с номером N, оболочка устанавливает переменную $? на значение больше 128. Большинство оболочек используют 128+N, а ksh93 — 256+N.
Если команда не найдена, оболочка должна вернуть статус 127. Если команда найдена, но не является исполняемой, статус возврата должен быть 126. [2] Обратите внимание, что это не относится ко всем оболочкам.
Если команда завершается неудачно из-за ошибки во время расширения или перенаправления, статус выхода больше нуля.
Язык программирования C позволяет программам выходить из основной функции или возвращаться из нее, чтобы сигнализировать об успехе или неудаче, возвращая целое число или возвращая макросы EXIT_SUCCESS
и EXIT_FAILURE
. В Unix-подобных системах они равны 0 и 1 соответственно. [3] Программа AC также может использовать exit()
функцию, определяющую целочисленный статус или макрос выхода в качестве первого параметра.
Возвращаемое значение main
передается exit
функции, которая для нулевых значений EXIT_SUCCESS
или EXIT_FAILURE
может преобразовать его в «форму, определенную реализацией» успешного завершения или неудачного завершения . [ нужна цитата ]
За исключением нуля и макросов EXIT_SUCCESS
и EXIT_FAILURE
, стандарт C не определяет значение кодов возврата. Правила использования кодов возврата различаются на разных платформах (см. разделы, посвященные конкретным платформам).
В терминологии DOS уровень ошибки — это целочисленный код завершения , возвращаемый исполняемой программой или подпрограммой . Уровни ошибок обычно варьируются от 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 и выше поддерживает аналогичную переменную псевдосреды %ERRORLLVL%, а также %ERRORLEVEL% . В CONFIG.SYS DR DOS 6.0 и выше поддерживает ONERROR для проверки состояния загрузки и кода возврата драйверов устройств, а также кода завершения программ. [6]
В Java любой метод может вызывать System.exit(int status)
, если только это не разрешено менеджером безопасности. Это завершит работу текущей виртуальной машины Java. «Аргумент служит кодом состояния; по соглашению, ненулевой код состояния указывает на ненормальное завершение». [8]
В OpenVMS успех обозначается нечетными значениями, а неудача — четными. Значение представляет собой 32-битное целое число с подполями: управляющие биты, номер объекта, номер сообщения и серьезность. Значения серьезности делятся на успех (успех, информационный) и сбой (предупреждение, ошибка, фатальный). [9]
В языке C Plan 9 статус выхода обозначается строкой, передаваемой функции выходов , а функция 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]
Расширенное руководство по написанию сценариев Bash и /usr/include/sysexits.h содержат некоторую информацию о значении кодов состояния выхода, отличных от 0. [17]
Microsoft Windows использует 32-битные целые числа без знака в качестве кодов выхода, [18] [19] , хотя интерпретатор команд обрабатывает их как знаковые. [20]
На коды выхода напрямую ссылаются, например, интерпретатор командной строки CMD.exe в errorlevel
терминологии, унаследованной от DOS . Процессы .NET Framework и Windows PowerShell ссылаются на него как на ExitCode
свойство объекта Process
.
{{cite book}}
: |work=
игнорируется ( помощь ) [1] [2] Архивировано 11 сентября 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]