【问题标题】:Do errno values differ across *nix systems?*nix 系统的 errno 值是否不同?
【发布时间】:2016-05-07 20:09:24
【问题描述】:

我正在编写一个库,它会在出现问题时发出 Linux 内核 4.4 errno 值 --- 这些是在程序的标头中定义的,并且不一定与主机errno 值。 (这样做是有充分理由的,我不能改变这部分。)但我保证它运行的环境:

  • 可以运行 ELF64 可执行文件
  • 为所有系统调用实现 libc 接口(即我保证系统有一个名为 open 的函数,其签名和语义与 open(2) 相同)。

我意识到,理论上,C/POSIX 标准允许 errno 值是实现者想要的任何值,理论上,我可以使用我想要的任何奇怪的 errno 值来编译我自己的内核。但是我将永远无法可靠地使用我自己没有编译的任何二进制文件,所以我可能会过得很糟糕,而且当事情随机中断时我不会感到惊讶。

实际上,我可以指望这种主机具有与内核的errno.h 中定义的值相同的errno 值吗?即,如果我直接在我的库中设置errno,我是否可以依靠主机的perror 获得明智的行为?

【问题讨论】:

  • 它非常依赖于平台,我会说你最好为每个不共享正确 errno 代码的操作系统定义自己的转换代码/

标签: c linux error-handling posix


【解决方案1】:

这是一个非常大的列表,将 POSIX 中的 ERRNO 值与各种系统上的实际关联消息和数字进行了比较。例如,Linux 和 BSD 之间的一些差异在电子表格中很明显:

http://www.ioplex.com/~miallen/errcmp.html

所以答案是,也许在实践中它相当安全,具体取决于您正在查看的代码?例如ENOMEMEACCESS,在此处列出的所有平台上都是相同的。

但一般不会。

【讨论】:

    【解决方案2】:

    这些名称是可靠的,至少在 Posix 中的名称是可靠的。实际值,不是。例如,它们在 Linux 和 *BSD 之间肯定是不同的。

    如果您使用主持人的errno.h 进行翻译,就可以了。其他任何事情都是推测性的。

    【讨论】:

      【解决方案3】:

      实际上这取决于错误。低于大约 35 时,它们是相同的,除了 EAGAIN 没有太大变化,但拆分方式不同。 (谁得到旧号码?EAGAIN 还是 EDEADLK?)

      我能想到两件事可行:

      1. 也许您可以只返回 Linux、OSX 和 BSD 常见的错误。
      2. 您可以编译一个主包含(感谢@Chris Beck)并制作某种以可打印名称为键的哈希映射,然后在运行时返回正确的值。

      【讨论】:

        猜你喜欢
        • 2016-12-29
        • 1970-01-01
        • 2011-03-05
        • 1970-01-01
        • 2015-12-15
        • 2012-10-07
        • 2018-05-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多