Когда assert()
назовите сбои, что код выхода используется, и где он документируется?
Стандарт 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 здесь о завершении программы (в частности, бит статуса выхода). В нем упоминаются условности, но нет твердых правил.
Я работал с очередями сообщений posix. У меня такая же ошибка mq_open не удалось выполнить с ошибкой 38 (ENOSYS).
Решение состоит в том, чтобы перестроить кенел с включенной POSIX MESSGE QUEUE в конфигурации ядра.
Это построит ядро с поддержкой очереди сообщений POSIX, и у меня это сработало.
Поблагодарить
Я не могу найти фактическую спецификацию для него (POSIX довольно трудно искать), но я нашел ссылку.
Выброшенное утверждение приводит к состоянию выхода, которое совпадает с тем, что EXIT_FAILURE
расширяется как (reference). Поскольку вы имеете дело с Linux, вы также имеете дело с POSIX, который дополнительно определяет поведение от c99.
Это зависит от конкретной реализации. Вы можете сделать так:
int main()
{
assert(0);
}
Затем запустите его:
> ./a.out
> echo $?
1 (<- or whatever)
Это, по крайней мере, скажет вам, чего ожидать для вашей установки. Я получаю 134 на паре linux боксов с gcc и g++.