当assert()
调用失败时,使用的退出代码是什么,它在哪里记录?
答案 0 :(得分:24)
c99标准规定assert
调用abort
和abort
内容说明返回代码:
通过函数调用raise(SIGABRT)将实现定义的状态不成功终止的形式返回给主机环境。
在c99标准here的第7.2.1.1节(断言)和7.20.4.1(中止)中有记录。
许多UNIX系统将返回128加上信号编号(SIGABRT是信号编号6),因此您可能得到134.无论您获得什么,都应该由C实现记录。
例如,请参阅here了解gcc。虽然它对返回调用环境的内容非常沉默。来自特定部分here:
一些选择是由库和操作系统(或编译独立环境时的其他环境)做出的;有关详细信息,请参阅其文档。
here:
大多数这些点的行为取决于C库的实现,并且不是由GCC本身定义的。
程序终止时glibc doco here也是如此(特别是退出状态位)。它提到了惯例,但没有确定的规则。
答案 1 :(得分:2)
这是特定于实现的。你可以这样做:
int main()
{
assert(0);
}
然后运行它:
> ./a.out
> echo $?
1 (<- or whatever)
这至少会告诉您对设置的期望。我在几个带有gcc和g ++的linux盒子上得到了134。
答案 2 :(得分:0)
我找不到它的实际规格(POSIX有点难以搜索),但我确实找到了参考。
抛出的断言导致退出状态与EXIT_FAILURE
扩展为(reference)的退出状态相同。由于您正在处理Linux,因此您也在处理POSIX,它进一步定义了c99的行为。
答案 3 :(得分:-1)
我正在使用posix消息队列我有同样的错误mq_open失败了errono 38(ENOSYS)。
工作重点是在内核配置中启用POSIX MESSGE QUEUE来重建kenel。
这将构建具有POSIX消息队列支持的内核,它对我有用。
感谢