哪个标准定义了 "sysconf()" 选项的值,例如“_SC_MONOTONIC_CLOCK”?

Which standard defines the value of "sysconf()" options like "_SC_MONOTONIC_CLOCK"?

(这是 的后续问题)

我尝试打印 _SC_MONOTONIC_CLOCK 的值并得到 149。我尝试了 Google search on POSIX 网站,但没有结果。

(回答后更新:149 在 Debian 上。刚刚在 macOS 和 FreeBSD 上试过,两者都使用值 74。)

POSIX states表示符号常量_SC_*定义在unistd.hheader:

The unistd.h header shall define the following symbolic constants for sysconf(): [...] _SC_MONOTONIC_CLOCK

但是,它没有定义这种符号常量的值是什么——它对您的应用程序不应该很重要(并且您不应该依赖于该值是什么)。

例如,GNU C 库列出了所有这些 in an enum; while newlib defines explicit values. OpenBSD and NetBSD 也使用显式但不同的值。

这是对 的扩展评论,太长而无法放入评论中。目的是阐明这与 pynexj 和其他对此感到困惑的人的可移植性有何关系。

常量 _SC_MONOTONIC_CLOCK 由 C 库定义,如果 C 库支持多种架构,则可能因架构而异。

在相同硬件架构上的所有 Linux 发行版中,使用相同或二进制兼容的 C 库。 (在此上下文中的二进制兼容意味着所有这些 C 库在相同的硬件架构上为 _SC_MONOTONIC_CLOCK 定义了相同的值。)

这意味着在某些 Linux 发行版上为某些 Linux 架构编译的代码将在同一架构上的其他 Linux 发行版中运行,如果其他依赖项(如动态库 installed/available) 都满足了。

在源代码层面,需要针对每个体系结构和操作系统单独编译代码。 Linux 使用相同库名称和位置的发行版可以 运行 相同的二进制文件(如果安装了必要的动态库),因为它们的 C 库要么相同,要么二进制兼容。

其他一些操作系统有兼容层,为 运行 宁 Linux 二进制文件公开 Linux 二进制兼容接口。这些可以 运行 some/most/all Linux 二进制文件,具体取决于兼容层的全面程度。这与 Wine 可用于 运行 Windows Linux.

二进制文件的方式非常相似

有一些古怪的 C 库实现,可能还有一些使用 modified/patched 代码的制造商分叉 "distributions",它们不是二进制兼容的。不过,我只在嵌入式设备上看到过这些(特别是那些缺少 MMU 或内存管理单元,因此不支持虚拟内存的设备),而不是在台式机、服务器或笔记本电脑上。