Соглашения о статусе завершения программы

Что является обычным возвращаемым значением для приложений в Windows и GNU/Linux соответственно. 0 означает успех. Но что следует использовать при прерывании по запросу пользователя. Когда я прерываю работу в Windows, она возвращает 3, но это значение отсутствует в списке кодов системных ошибок, если оно не является ERROR_PATH_NOT_FOUND. GNU binutils использует 1. С точки зрения пользователя, возвращение GetLastError или errno было бы хорошо, поскольку они задокументированы, но кажется, что они охватывают только коды состояния более низкого уровня. Я ищу значение, которое представляет собой «Приложение завершено неудачно».

Причина, по которой я ране, в том, что я хочу

exit(errcode)

из обработчика сигналов, который улавливает некоторые нарушения прав доступа/SIGSEGV (т. е. ошибки программирования) после вывода сообщения о том, где это произошло. Тогда код ошибки должен быть отличим от ошибок пользовательского ввода.


person user877329    schedule 15.08.2013    source источник
comment
Ненулевой код выхода означает неудачное завершение.   -  person devnull    schedule 15.08.2013
comment
Что ж, поскольку -1 не равно нулю и не является уже использованным кодом ошибки, все в порядке.   -  person user877329    schedule 15.08.2013


Ответы (2)


Это может помочь, http://tldp.org/LDP/abs/html/exitcodes.html это стандартный код выхода. Остальные, я думаю, зависят от программы. в основном вам нужно проверить документацию конкретного программного обеспечения, которое вы ищете. Как сказал @devnull, любой код выхода, отличный от нуля, означает неудачное завершение.

person drgn    schedule 15.08.2013
comment
Для полноты, код выхода 125 означает не ту ошибку, которую мы ищем для git-bisect. Неправильное использование этого значения для любой другой цели должно быть совершенно нормально — это имеет значение только в одноразовых сценариях, работающих под управлением git-bisect, для поиска конкретной ошибки, и они в любом случае должны жестко контролировать свой статус выхода. - person user2394284; 17.01.2016

Это всего лишь несколько соглашений о кодах выхода. Давайте посмотрим, что говорят некоторые руководства:

Справочное руководство по библиотеке GNU C

  1. Существуют соглашения о том, какие виды значений состояния должны возвращать определенные программы. Наиболее распространенным соглашением является просто 0 для успеха и 1 для неудачи...

  2. Общее соглашение резервирует значения статуса 128 и выше для специальных целей.

  3. В некоторых системах, отличных от POSIX, используются другие соглашения для значений статуса выхода.
  4. Для большей переносимости вы можете использовать макросы EXIT_SUCCESS и EXIT_FAILURE для обычного значения статуса для успеха и неудачи.

ISO/IEC 9899:2011 (стандарт C11)

Если значение состояния равно нулю или EXIT_SUCCESS, возвращается определяемая реализацией форма завершения состояния успешно. Если значением статуса является EXIT_FAILURE, возвращается определенная реализацией форма завершения статуса неудачное. В противном случае возвращаемый статус определяется реализацией.

Это означает, что если вы хотите (и в большинстве случаев этого достаточно) просто указать успех или неудачу, вам определенно следует использовать EXIT_SUCCESS и EXIT_FAILURE. Если вы хотите указать другие ошибки, вы должны заново изобрести свои собственные статусы выхода. Например:

#define HEX_FILE_CREATE 2
#define HEX_FILE_CREATE 3
...

Дополнительные советы о том, что и как следует возвращать:

  1. Предупреждение. Не пытайтесь использовать количество ошибок в качестве статуса выхода. На самом деле это не очень полезно; родительский процесс, как правило, не заботится о том, сколько ошибок произошло. Хуже того, это не работает, потому что значение состояния усекается до восьми бит. Таким образом, если программа попытается сообщить о 256 ошибках, родитель получит отчет об 0 ошибках, т. е. успех.
  2. По той же причине не получится использовать значение errno в качестве статуса выхода — они могут превышать 255.

Вывод:

  1. Для успеха всегда используйте EXIT_SUCCESS
  2. Ваш статус выхода из-за сбоя должен быть между 1 и 127.
  3. Не используйте код ошибки errno в качестве статуса выхода.
person likern    schedule 24.01.2014