*nix 系统的 errno 值是否不同?
Do errno values differ across *nix systems?
我正在编写一个库,当出现问题时会发出 Linux 内核 4.4 errno
值 --- 这些是在程序的 header 中定义的,而不是必须 与主机 errno
值相同。 (这样做是有充分理由的,我无法更改这一部分。)但我保证 运行 正在使用的环境:
- 可以 运行 ELF64 可执行文件
- 为所有系统调用实现 libc 接口(即我保证系统有一个名为
open
的函数,其签名和语义与 open(2)
相同)。
我意识到在理论上,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
所以答案是,也许在实践中它相当安全,具体取决于您正在查看的代码?例如 ENOMEM
、EACCESS
,在此处列出的所有平台上都是相同的。
但一般不会
其实真的要看错误。低于大约 35 它们是相同的,除了 EAGAIN 没有太大变化但分开不同。 (谁得到旧号码?EAGAIN 或 EDEADLK?)
我能想到两个可行的方法:
- 也许您可以 return Linux、OSX 和 BSD 常见的错误。
- 您可以编译一个主包含(谢谢,@Chris Beck)并制作某种以可打印名称为键的哈希映射,然后在运行时 return 正确的值。
我正在编写一个库,当出现问题时会发出 Linux 内核 4.4 errno
值 --- 这些是在程序的 header 中定义的,而不是必须 与主机 errno
值相同。 (这样做是有充分理由的,我无法更改这一部分。)但我保证 运行 正在使用的环境:
- 可以 运行 ELF64 可执行文件
- 为所有系统调用实现 libc 接口(即我保证系统有一个名为
open
的函数,其签名和语义与open(2)
相同)。
我意识到在理论上,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
所以答案是,也许在实践中它相当安全,具体取决于您正在查看的代码?例如 ENOMEM
、EACCESS
,在此处列出的所有平台上都是相同的。
但一般不会
其实真的要看错误。低于大约 35 它们是相同的,除了 EAGAIN 没有太大变化但分开不同。 (谁得到旧号码?EAGAIN 或 EDEADLK?)
我能想到两个可行的方法:
- 也许您可以 return Linux、OSX 和 BSD 常见的错误。
- 您可以编译一个主包含(谢谢,@Chris Beck)并制作某种以可打印名称为键的哈希映射,然后在运行时 return 正确的值。