В случае сбоя assert (), какой код завершения программы? - PullRequest
21 голосов
/ 19 мая 2010

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

Ответы [ 4 ]

24 голосов
/ 19 мая 2010

Стандарт c99 гласит, что assert вызывает abort, а материал abort утверждает это о коде возврата:

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

Это задокументировано в разделах 7.2.1.1 (утверждение) и 7.20.4.1 (отмена) стандарта c99 здесь .

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

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

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

И здесь :

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

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

2 голосов
/ 19 мая 2010

Это зависит от реализации. Вы могли бы сделать это:

int main()
{
    assert(0);
}

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

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

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

0 голосов
/ 20 мая 2010

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

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

0 голосов
/ 19 мая 2010

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

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

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

Спасибо

...