【问题标题】:Are Unix/Linux system calls part of POSIX library functions?Unix/Linux 系统调用是 POSIX 库函数的一部分吗?
【发布时间】:2015-07-21 06:14:44
【问题描述】:

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 unix posix system-calls


    【解决方案1】:

    Linux 系统调用在syscalls(2) 中列出。大多数是 POSIX,但有些是特定于 Linux 的(例如signalfd(2) 等...)。 POSIX 是一个规范,并不“知道”syscalls(在 POSIX 视图中,这是一个实现细节)。

    一些函数在 POSIX 中是标准化的,但在 Linux 库代码中实现,例如dlopen(3)(参见 POSIX dlopen)在 mmap(2) 之上构建...

    【讨论】:

      【解决方案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 语言接口匹配。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-01-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-10
            • 1970-01-01
            • 2021-04-26
            • 1970-01-01
            相关资源
            最近更新 更多