【问题标题】:When assert() fails, what is the program exit code?当 assert() 失败时,程序退出代码是什么?
【发布时间】:2010-05-19 03:48:34
【问题描述】:

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

【问题讨论】:

    标签: c linux assert


    【解决方案1】:

    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 正是我得到的。
    • 链接到 GCC 的文档似乎不包含任何感兴趣的内容,我也找不到您引用的内容。
    • 您可以更改 glibc doco 链接以直接指向此处,除非我错过了什么? gnu.org/s/libc/manual/html_node/Exit-Status.html#Exit-Status
    • @Matt,它们是我提供的链接下方的链接。我已将特定链接添加到引号中。我给出的链接是顶级的,它提供了很多 GCC 的实现细节,所以它仍然很方便,让您可以深入了解很多不同的部分(c、c++ 等)。
    • 对于 Linux 上的 C# / .NET Core 控制台应用程序也恰好是 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)
    【解决方案2】:

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

    int main()
    {
        assert(0);
    }
    

    然后运行它:

    ./a.out
    echo $?
    

    1(

    这至少会告诉您对您的设置有什么期望。我在几个带有GCC 和 g++ 的 Linux 机器上得到了 134

    【讨论】:

    • 您应该始终以具体参考标准来支持您的答案。
    • 编译器并不总是遵循 T 的标准。(我在看着你微软)虽然很高兴知道标准所说的 - 了解编译器的真正含义也同样好做。他们应该做的并不总是他们实际做的。这和标准实际上并不是免费的。
    【解决方案3】:

    我找不到它的实际规范(POSIX 有点难搜索),但我确实找到了参考。

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

    【讨论】:

      【解决方案4】:

      我正在使用POSIX 消息队列,我遇到了同样的错误,mq_open 失败并出现错误 38 (ENOSYS)。

      解决方法是在内核配置中启用 POSIX MESSAGE QUEUE 来重建内核。

      这将构建具有 POSIX 消息队列支持的内核,它对我有用。

      【讨论】:

      猜你喜欢
      • 2013-09-24
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      相关资源
      最近更新 更多