Когда утверждают () сбои, каков код выхода программы?

Когда assert() назовите сбои, что код выхода используется, и где он документируется?

22
задан Matt Joiner 19 May 2010 в 03:48
поделиться

4 ответа

Стандарт c99 гласит, что assert вызывает abort , а в abort коде возврата говорится следующее:

Определяемая реализацией форма статуса неудачного завершения возвращается в среду хоста посредством вызова функции (SIGABRT).

Это описано в разделах 7.2.1.1 (assert) и 7.20.4.1 (abort) стандарта c99 здесь .

Многие системы UNIX возвращают 128 плюс номер сигнала (SIGABRT - это сигнал номер 6), так что вы можете получить 134. Что бы вы ни получили, это должно быть задокументировано реализацией C.

Например, см. здесь для gcc. Хотя это довольно тихо о том, что возвращается в вызывающую среду. Из специальных разделов здесь :

Некоторые варианты выбора выполняются библиотекой и операционной системой (или другой средой при компиляции для автономной среды); обратитесь к их документации для получения подробной информации.

И здесь :

Поведение большинства из этих точек зависит от реализации библиотеки C и не определяется самим GCC.

Так же как и документация glibc здесь о завершении программы (в частности, бит статуса выхода). В нем упоминаются условности, но нет твердых правил.

24
ответ дан 29 November 2019 в 05:31
поделиться

Я работал с очередями сообщений posix. У меня такая же ошибка mq_open не удалось выполнить с ошибкой 38 (ENOSYS).

Решение состоит в том, чтобы перестроить кенел с включенной POSIX MESSGE QUEUE в конфигурации ядра.

Это построит ядро ​​с поддержкой очереди сообщений POSIX, и у меня это сработало.

Поблагодарить

-1
ответ дан 29 November 2019 в 05:31
поделиться

Я не могу найти фактическую спецификацию для него (POSIX довольно трудно искать), но я нашел ссылку.

Выброшенное утверждение приводит к состоянию выхода, которое совпадает с тем, что EXIT_FAILURE расширяется как (reference). Поскольку вы имеете дело с Linux, вы также имеете дело с POSIX, который дополнительно определяет поведение от c99.

0
ответ дан 29 November 2019 в 05:31
поделиться

Это зависит от конкретной реализации. Вы можете сделать так:

int main()
{
    assert(0);
}

Затем запустите его:

> ./a.out
> echo $?
1 (<- or whatever)

Это, по крайней мере, скажет вам, чего ожидать для вашей установки. Я получаю 134 на паре linux боксов с gcc и g++.

2
ответ дан 29 November 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: