当assert()失败时,程序退出代码是什么?

时间:2010-05-19 03:48:34

标签: c linux assert

assert()调用失败时,使用的退出代码是什么,它在哪里记录?

4 个答案:

答案 0 :(得分:24)

c99标准规定assert调用abortabort内容说明返回代码:

  

通过函数调用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消息队列支持的内核,它对我有用。

感谢