Unix/Linux 系统调用全部或大部分采用 POSIX 吗?
许多 Linux/Unix 编程书籍都说 POSIX 库函数可能是 OS 系统调用的包装器,也可能不是。例如。 http://www.makelinux.net/books/lkd2/ch05lev1sec1,和 https://www.safaribooksonline.com/library/view/understanding-the-linux/0596005652/ch10s01.html
POSIX 的一部分(称为单一 UNIX 规范)定义了 UNIX。因此我认为 POSIX 定义了 Unix(和 Linux)的系统调用。
那么Unix/Linux系统调用是POSIX库函数的一部分吗?
谢谢。
Linux 系统调用在 syscalls(2) 中列出。大多数是 POSIX,但有些是特定于 Linux 的(例如 signalfd(2) 等)。 POSIX 是一个规范,并且不“了解”系统调用(在 POSIX 视图中,这是一个实现细节)。
一些函数在 POSIX 中标准化,但在 Linux 库代码中实现,例如dlopen(3)(参见 POSIX dlopen)构建于 mmap(2)...
严格来说,你的说法因此我认为POSIX定义了Unix(和Linux)的系统调用稍微不正确。系统调用本身不是 POSIX 的一部分。该标准定义了一个编程接口,即需要按照指定的系统实现的函数才能兼容,但它没有说明它们是否需要作为系统调用或其他方式实现。
虽然一些 POSIX 定义的函数毫无疑问总是作为标准库函数实现,例如
fopen
或 fprintf
,但其他一些函数通常作为系统调用实现,但没有任何强制要求,并且它们是否可能会从版本到版本发生变化。另一个。这实际上是由 Unix 实现设计者决定的。
无论如何,典型 Unix 或 Linux 内核提供的系统调用中只有一部分与 POSIX xsh C 语言接口相匹配。
clone(2) 和 inotify(7):clone 是系统调用,inotify 是一组调用,一个 API。
这些未列为 POSIX,也不属于 POSIX 规范的一部分。 对于 UNIX/Linux 上的许多版本来说都是如此。
Linux 通常不被考虑
POSIX
,有一些方法可以编写代码并使用 POSIXLY_CORRECT
环境变量来(通常)获得您所需要的行为方式您期望的。 Solaris 有类似的问题,可以通过使用 PATH 变量来处理,例如,使用 /usr/xpg4/bin
中的一些命令而不是 /usr/bin
。
另一方面,read(2) 具有 POSIX 规范,任何声称符合 POSIX 规范的系统都应该按照定义支持它。
所以你的问题的答案可能是:是和否。
基本上,您在第 2 节手册中看到的大多数系统调用都是 POSIX,但不能保证情况确实如此。 如果您按照定义使用 POSIX 调用,则很可能具有良好的可移植性。
POSIX 定义的调用相对较少,不属于 Linux 或其他 Unix 系统。 它们往往是尚未实现的较新的函数调用。 例如,各种
*at()
功能可能尚未在所有地方实现,因此 fchmodat()
不如 fchmod()
那样广泛移植
或chmod()
。
有许多属于 Linux 和 Unix 的调用,但不属于 POSIX。 例如,
mount(2)
和umount(2)
都不是 POSIX 强制要求的,但它们自远古以来就一直是 Unix 和 Linux 的一部分。