【问题标题】:Where can I see the list of functions that interact with errno?在哪里可以看到与 errno 交互的函数列表?
【发布时间】:2010-11-10 03:17:58
【问题描述】:

在《The C Programming Language》一书中说:

"库中的许多函数在发生错误或文件结束时设置状态指示器。这些 指标可以明确设置和测试。此外,整数表达式errno(声明 在<errno.h>) 中可能包含一个错误号,提供有关最 最近的错误。”

在哪里可以看到这些函数的列表?

【问题讨论】:

  • @Leif,很酷,你正在通过 K&R 工作。我刚刚在假期里做了几天同样的事情。 (-:

标签: c++ c error-handling standard-library errno


【解决方案1】:

标准是这样说errno的:

errno 的值在程序启动时为零,但绝不会被任何库设置为零 功能。 errno 的值可以通过库函数调用设置为非零值,无论是否存在错误,只要在本国际标准的函数描述中没有记录 errno 的使用。

这对我说,任何库函数都可以以任何它喜欢的方式与errno 混在一起,除了:

  • 无法将errno 设置为0
  • 如果标准明确规定,它不能做它喜欢做的事

请注意,该标准在脚注中建议以下内容:

因此,使用errno 进行错误检查的程序应在库函数调用之前将其设置为零,然后在后续库函数调用之前对其进行检查。当然,库函数可以在入口保存errno的值,然后将其设置为零,只要在返回之前errno的值仍然为零,则恢复原始值。

正如其他答案中所述,标准中没有设置errno 的函数也很常见。

【讨论】:

    【解决方案2】:

    您应该假设任何函数都可以设置 errno,而不仅仅是标准库中的那些。因此,列表会有点毫无意义。

    【讨论】:

    • 我不同意,尽管生活肯定会更轻松!我目前正在努力处理一些返回消息的嵌入式库,例如“发生错误:errno = 0”所以正如 OP 所暗示的那样,如果你能原谅你名字上不可抗拒的双关语,那么能够过滤会很有帮助删除那些没有将 errno 设置为有用值的函数。
    • @Adam 那会是什么双关语?我想我遗漏了一些明显和粗鲁的东西?
    • 问题不是关于任何函数——而是关于标准库中的函数。该标准记录了库中修改 errno 的函数。没有意义的是将保证不会修改 errno 的函数视为可以修改。
    • @Neil:巴特沃斯滤波器是一种经典的电子电路,作为数学欺骗的一部分教授给 EE 本科生。如果您期待更多的粗鲁,很抱歉让您失望。 :-) @Dingo:同意这些功能已记录在案并且(我们希望)遵循标准。我的观点是,我从未遇到过将 errno 设置为有用值的函数的规范列表。
    • @Adam 是的,我知道 Butterworth 过滤器 - 我希望有更多(或根本没有)粗鲁的东西:-(
    【解决方案3】:

    如果发生错误,即函数返回 -1 时,几乎所有 posix 库函数都可以设置 errno。 线程函数是一个例外,因为从多个线程中设置一个全局错误变量会非常危险。成功时返回 0,否则返回错误代码(此代码与 errno 兼容,因此您可以在其上使用 strerror 和 perror 函数)。

    【讨论】:

    • 真的有一个 POSIX 实现有线程但没有线程本地 errno 吗?
    • errno 被指定为线程特定的。 -1 表示有关此问题的错误信息。
    • 我从来没有说过 errno 不是线程特定的。无论如何,线程函数都不会设置 errno。
    • 因为从多个线程设置一个全局错误变量:根据标准,errno 是一个“扩展为具有 int 类型和线程本地的可修改左值的宏存储持续时间”errno“不必是对象的标识符”。
    【解决方案4】:

    一个正确的问题可能是值是什么 errno 可以得到它们各自的含义。您可以在intro(2) 中看到它们。

    【讨论】:

      【解决方案5】:

      @Adam,正如尼尔所说,任何函数都可以针对 errno.h 编译并设置 errno。根据定义,不可能列出以这种方式编译的所有实用程序以使用核心 errno 功能。

      也就是说,可以通过多种方式将错误报告给用户。使用 errno 只是其中之一。

      【讨论】:

        【解决方案6】:

        您可以使用您喜欢的编辑器和“在文件中查找...”来搜索包含 errno 关键字的文件。

        【讨论】:

        • 加粗字体会占用更多磁盘空间?
        • 我不懂你。无论如何,我的意思是搜索库文件(*.c,*.cpp)。
        猜你喜欢
        • 2014-07-06
        • 2021-11-02
        • 2021-10-09
        • 2016-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-24
        • 1970-01-01
        相关资源
        最近更新 更多