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

时间:2016-01-29 22:55:15

标签: c linux error-handling posix

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

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

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

实际上,我可以指望这种主机具有与内核errno中定义的值相同的errno.h值吗?即如果我直接在我的图书馆中设置perror,我可以依赖主持人errno的合理行为吗?

3 个答案:

答案 0 :(得分:4)

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

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

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

但总的来说没有。

答案 1 :(得分:2)

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

如果您使用主持人Log.d(...)进行翻译,那么您可以。其他任何东西都是推测性的。

答案 2 :(得分:2)

实际上它确实取决于错误。低于约35,它们是相同的,除了EAGAIN,它没有那么大的改变,但分裂不同。 (谁得到旧号码?EAGAIN或EDEADLK?)

我可以想到两件可行的方法:

  1. 也许您只能返回Linux,OSX和BSD常见的错误。
  2. 你可以编译一个master include(感谢,@Chris Beck)并制作一些由可打印名称键入的哈希映射,然后在运行时返回正确的值。