【发布时间】:2010-05-19 03:48:34
【问题描述】:
当assert() 调用失败时,使用的退出代码是什么,它记录在哪里?
【问题讨论】:
当assert() 调用失败时,使用的退出代码是什么,它记录在哪里?
【问题讨论】:
C99(在 C11 中未更改)标准规定 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 也是如此(特别是退出状态位)。它提到了约定,但没有明确的规则。
【讨论】:
134:在 C# 中失败 Trace.Assert() 在 Bash 中 echo $?。 .NET Core 最可能的版本是 3.1.21-1(尽管也有“.NET Host”6.0.1))。 Linux 系统是Ubuntu MATE 20.04)。构建工具的重要日期大约是 2021-10 年(后面有一个更新)。 Main() 的签名是 static void Main(string[] args)。
它是特定于实现的。你可以这样做:
int main()
{
assert(0);
}
然后运行它:
./a.out
echo $?
1(
这至少会告诉您对您的设置有什么期望。我在几个带有GCC 和 g++ 的 Linux 机器上得到了 134。
【讨论】:
我找不到它的实际规范(POSIX 有点难搜索),但我确实找到了参考。
抛出的断言导致退出状态与 EXIT_FAILURE 扩展为 (reference) 相同。由于您正在处理 Linux,因此您也在处理 POSIX,它进一步定义了 c99 的行为。
【讨论】:
我正在使用POSIX 消息队列,我遇到了同样的错误,mq_open 失败并出现错误 38 (ENOSYS)。
解决方法是在内核配置中启用 POSIX MESSAGE QUEUE 来重建内核。
这将构建具有 POSIX 消息队列支持的内核,它对我有用。
【讨论】: