2010-05-19 33 views

回答

22

C99标准规定,assert电话abortabort东西,指出这对返回代码:

的状态实现定义的形式不成功的终止是由函数的方式返回给主机环境呼叫加注(SIGABRT)。

它记录在c99标准here的7.2.1.1节(断言)和7.20.4.1(中止)中。

许多UNIX系统将返回128加上信号编号(SIGABRT是信号编号6),因此您可能会得到134.无论您得到什么,它都应该由C实现记录。

例如,请参阅gcc的here。尽管对于返回到呼叫环境的内容仍然保持沉默。从特定部分here

有些选择是由库和操作系统(或为独立环境编译时的其他环境)进行的;有关详细信息,请参阅其文档。

而且here

大部分这些点的行为依赖于C库的实现,而不是通过GCC本身定义。

那么,在程序终止(特别是退出状态位)glibc的DOCO here。它提到惯例,但没有坚定的规则。

+0

这是一个很好的答案,而134正是我所得到的。 – 2010-05-19 05:30:57

+0

链接到GCC的文档似乎不包含任何感兴趣的内容,也不能找到您所做的报价。 – 2010-05-19 05:35:11

+0

你可能会改变glibc doco链接直接指向这里,除非我错过了一些东西? http://www.gnu.org/s/libc/manual/html_node/Exit-Status.html#Exit-Status – 2010-05-19 05:35:52

2

它是特定于实现的。你可以这样做:

int main() 
{ 
    assert(0); 
} 

然后运行它:

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

这至少会告诉你什么期望您的设置。我使用gcc和g ++在几个linux盒子上使用gettitng 134。

+3

您应该始终回答具体参考标准的答案。 – wilhelmtell 2010-05-19 04:04:00

+1

编译器并不总是遵循T的标准。(我在看你微软)虽然知道标准所说的内容是很好的,但知道编译器真正做什么也是同样好的。他们应该做的并不总是他们实际做的。这和标准实际上并不是免费的。 – 2013-10-14 04:32:46

-1

我正在与posix消息队列我有同样的错误mq_open失败errono 38(ENOSYS)。

工作的重点是在内核配置中启用POSIX MESSGE QUEUE来重建kenel。

这将建立与POSIX消息队列支持的内核,它为我工作。

感谢

+1

我想你的意思是把这个答案放在另一个问题上。 – 2010-05-19 10:25:58

0

我无法找到实际的规范它(POSIX是一种很难搜索),但我没有找到一个参考。

抛出的断言导致退出状态与EXIT_FAILURE扩展为(reference)的任何状态相同。由于您正在处理Linux,因此您也正在处理POSIX,它进一步定义了c99中的行为。