stringtranslate.com

Статус выхода

В вычислительной технике статус выхода (также код выхода или значение выхода ) завершенного процесса — это целое число, которое становится доступным его родительскому процессу (или вызывающему). В DOS это может называться errorlevel .

При выполнении компьютерных программ операционная система создает абстрактную сущность , называемую процессом , в которой ведется учет для этой программы. В многозадачных операционных системах, таких как Unix или Linux , новые процессы могут создаваться активными процессами. Процесс, который порождает другой, называется родительским процессом , в то время как созданные им процессы являются дочерними . Дочерние процессы выполняются одновременно с родительским процессом. Методика порождения дочерних процессов используется для делегирования некоторой работы дочернему процессу, когда нет причин останавливать выполнение родительского процесса. Когда дочерний процесс завершает выполнение, он завершает работу, вызывая системный вызов exit . Этот системный вызов упрощает передачу кода статуса завершения обратно родительскому процессу, который может получить это значение с помощью системного вызова wait .

Семантика

Родитель и потомок могут иметь понимание о значении статусов выхода. Например, это обычная практика программирования, когда дочерний процесс возвращает (выходит с) нулем в родительский процесс, что означает успех. Помимо этого возвращаемого значения от потомка, родительскому процессу может быть доступна и другая информация, например, как процесс завершился, как обычно, так и по сигналу .

Конкретный набор возвращаемых кодов уникален для программы, которая его устанавливает. Обычно он указывает на успех или неудачу. Значение кода, возвращаемого функцией или программой, может указывать на конкретную причину неудачи. Во многих системах чем выше значение, тем серьезнее причина ошибки. [1] В качестве альтернативы каждый бит может указывать на другое условие, при этом они оцениваются оператором or вместе, чтобы дать окончательное значение; например, fsck делает это.

Иногда, если коды разработаны с этой целью, их можно использовать непосредственно в качестве индекса ветвления при возврате в инициирующую программу, чтобы избежать дополнительных проверок.

AmigaOS

В 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

В OpenVMS успех обозначается нечетными значениями, а неудача — четными. Значение представляет собой 32-битное целое число с подполями: биты управления, номер объекта, номер сообщения и серьезность. Значения серьезности делятся на успех (Успех, Информационное) и неудачу (Предупреждение, Ошибка, Фатальное). [9]

План 9

В языке C Plan 9 статус выхода указывается строкой, передаваемой функции exits , а функция main имеет тип void .

POSIX

В 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.

Смотрите также

Ссылки

  1. ^ «Уровни ошибок». Страницы сценариев Роба ван дер Вуда . Проверено 26 августа 2007 г.
  2. ^ "Язык команд оболочки - Статус выхода для команд". The Open Group . Получено 2015-07-07 .
  3. ^ ab "Справочное руководство по библиотеке GNU C 25.6.2: Статус выхода". Gnu.org . Получено 2012-07-09 .
  4. ^ аб Пол, Матиас Р. (1 мая 1997 г.) [01 октября 1993 г.]. BATTIPs — Советы и рекомендации по программированию пакетных заданий (на немецком языке). 7: УРОВЕНЬ ОШИБКИ. Архивировано из оригинала 23 августа 2017 г. Проверено 23 августа 2017 г. {{cite book}}: |work=игнорируется ( помощь ) [1] [2] Архивировано 11.09.2017 в archive.today (Примечание. BATTIPS.TXT является частью MPDOSTIP.ZIP. Предоставленная ссылка указывает на более старую версию файла BATTIPS.TXT, преобразованную в HTML.) [3]
  5. ^ Ауэр, Эрик; Пол, Маттиас Р.; Холл, Джим (2015-12-24) [2003-12-31]. "MS-DOS errorlevels". Архивировано из оригинала 2015-12-24.
  6. ^ abcdef Пол, Матиас Р. (30 июля 1997 г.) [1 мая 1994 г.]. NWDOS-TIPs — советы и подсказки для Novell DOS 7, с просмотром недокументированных подробностей, ошибок и обходных путей. Выпуск 157 (на немецком языке) (3-е изд.). Архивировано из оригинала 4 ноября 2016 г. Проверено 6 августа 2014 г. {{cite book}}: |work=игнорируется ( помощь ) (Примечание. NWDOSTIP.TXT — это всеобъемлющая работа по Novell DOS 7 и OpenDOS 7.01 , включающая описание многих недокументированных функций и внутренних компонентов. Приведенная ссылка указывает на преобразованную в HTML версию файла, которая является частью коллекции MPDOSTIP.ZIP.) [4]
  7. ^ Аллен, Уильям; Аллен, Линда. "Windows 95/98/ME ERRORLEVELs". Архивировано из оригинала 2011-07-07.
  8. ^ "Java 1.6.0 API". Sun Microsystems . Получено 2008-05-06 .
  9. ^ "Формат OpenVMS значений возвращаемого статуса". H71000.www7.hp.com. Архивировано из оригинала 2012-03-19 . Получено 2012-07-09 .
  10. ^ sys_wait.h  – Справочник базовых определений, Единая спецификация UNIX , версия 4 от The Open Group
  11. ^ waitid  – Справочник по системным интерфейсам, Единая спецификация UNIX , версия 4 от The Open Group
  12. ^ wait  – Справочник по системным интерфейсам, Единая спецификация UNIX , версия 4 от The Open Group
  13. ^ "2.4.3 Действия сигнала". The Open Group . Получено 2019-02-08 .
  14. ^ "Глава 6. Выход и статус выхода". Faqs.org . Получено 2012-07-09 .
  15. ^ sysexits(3) : предпочтительные коды завершения для программ –  Руководство по функциям библиотеки FreeBSD
  16. ^ Поиск Google по запросу «"sysexits.h" site:github.com» выдает «Около 3540 результатов»; получено 21.02.2013.
  17. ^ «Коды выхода со специальными значениями».
  18. ^ "Функция ExitProcess" . Получено 2016-12-16 .
  19. ^ "Функция GetExitCodeProcess" . Получено 2022-04-22 .
  20. ^ "ExitCodes больше 255, возможны?" . Получено 28.09.2009 .