【问题标题】:Are Unix/Linux system calls part of POSIX library functions?Unix/Linux 系统调用是 POSIX 库函数的一部分吗?
【发布时间】:2015-07-21 06:14:44
【问题描述】:
【问题讨论】:
标签:
linux
unix
posix
system-calls
【解决方案2】:
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 调用,则很可能具有良好的可移植性。
【解决方案3】:
POSIX 定义的不属于 Linux 或其他 Unix 系统的调用相对较少。它们往往是尚未实现的较新的函数调用。例如,*at() 的各种功能可能还没有在所有地方实现,所以fchmodat() 的可移植性不如fchmod()
或chmod()。
有许多调用是 Linux 和 Unix 的一部分,而不是 POSIX 的一部分。例如,mount(2) 和 umount(2) 都不是 POSIX 强制要求的,但它们自古以来就是 Unix 和 Linux 的一部分。
【解决方案4】:
严格来说,您的说法因此我认为 POSIX 定义了 Unix(和 Linux)的系统调用有点不正确。这样的系统调用不是 POSIX 的一部分。该标准定义了一个编程接口,即需要按照指定的系统实现兼容的功能,但它没有说明它们是否需要作为系统调用或其他方式实现。
虽然某些 POSIX 定义的函数毫无疑问总是作为标准库函数实现,例如 fopen 或 fprintf,但其他一些通常作为系统调用实现,但没有任何强制要求,它们是否可能会从释放给另一个。真正由 Unix 实现设计者来决定。
在任何情况下,只有典型 Unix 或 Linux 内核作为系统调用提供的子集与 POSIX xsh C 语言接口匹配。