Unix/Linux系统调用是否是POSIX库函数的一部分?

7
Unix/Linux系统调用是否全部或大部分在POSIX中?
许多Linux/Unix编程书籍都说,POSIX库函数可能是操作系统系统调用的包装器,也可能不是。例如:http://www.makelinux.net/books/lkd2/ch05lev1sec1https://www.safaribooksonline.com/library/view/understanding-the-linux/0596005652/ch10s01.html
POSIX的一部分(称为Single UNIX Specification)定义了UNIX。因此,我认为POSIX定义了Unix(和Linux)的系统调用。
那么,Unix/Linux系统调用是否属于POSIX库函数的一部分呢?
谢谢。
4个回答

9
Linux系统调用列表在syscalls(2)中列出。大多数是POSIX,但有些是特定于Linux的(例如signalfd(2)等)。POSIX是一项规范,并不知道syscalls(在POSIX视图中,这些是实现细节)。
一些函数在POSIX中标准化,但在Linux库代码中实现,例如dlopen(3)(参见POSIX dlopen),构建在mmap(2)之上...

8
严格来说,您的陈述“因此我认为POSIX定义了Unix(和Linux)的系统调用”略有不妥。作为这样的系统调用并不是POSIX的一部分。该标准定义了编程接口,即必须按照规定实现的函数,以使系统符合标准,但它对它们是否需要像系统调用或其他方式进行实现没有任何约束。
尽管POSI定义的某些函数无疑总是实现为标准库函数,如fopen或fprintf,而有些则通常被实现为系统调用,但没有任何强制规定,它们是否会在一个版本到另一个版本中发生变化,真正取决于Unix实现设计人员。
在任何情况下,只有典型的Unix或Linux内核提供的系统调用子集与POSIX xsh C语言接口相匹配。

3

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调用,您很可能会获得良好的可移植性。


1
相对而言,POSIX中定义的不属于Linux或其他Unix系统的调用比较少。它们往往是一些较新的函数调用,尚未实现。例如,各种*at()函数可能还没有在所有地方实现,因此fchmodat()不如fchmod()chmod()具有广泛的可移植性。
许多Linux和Unix的调用不属于POSIX。例如,mount(2)umount(2)都不是POSIX所规定的,但它们从时间上来看一直是Unix和Linux的一部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接