*nix 系统的 errno 值是否不同?

Do errno values differ across *nix systems?

我正在编写一个库,当出现问题时会发出 Linux 内核 4.4 errno 值 --- 这些是在程序的 header 中定义的,而不是必须 与主机 errno 值相同。 (这样做是有充分理由的,我无法更改这一部分。)但我保证 运行 正在使用的环境:

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

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

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

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

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

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

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

但一般不会

其实真的要看错误。低于大约 35 它们是相同的,除了 EAGAIN 没有太大变化但分开不同。 (谁得到旧号码?EAGAIN 或 EDEADLK?)

我能想到两个可行的方法:

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