理解什么是 POSIX
潘忠显 / 2022-01-11
相信你不止一次的在教材、Manual 中看到 POSIX,今天带你理解一下 POSIX 究竟是什么。
什么是 POSIX
看了跟没看一样的 Wiki 定义:
可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX)是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945。
APUE 上列出了部分 POSIX 标准定义的必须头文件、可选头文件、可选接口组、选项码等。也标注了几种主流操作系统是否实现了这些内容。
Linux kernel + Glibc + Bash 能涵盖大部分 POSIX 接口规范吗?
APUE 的描述以及 “Portable Operating System Interface” 的缩写给我带来一种错觉认为 POSIX 就真的只有接口的规范。
我们常用是 Linux 操作系统(广义),而我们也经常读到:大部分 Linux 发行版是 Mostly POSIX-compliant,也有些 Linux 发行版是经过 Unix 认证的。我就去 StackOverflow 和码客上提了个问题:
问:Linux kernel + Glibc + Bash 能涵盖大部分 POSIX 接口规范吗?还有没有什么比较完整而知名的模块可以加在上边这个表达式的左边?
其实答案是否定的,从两个方面来讲:
- POSIX分成4部分:Base Definitions、System Interfaces、Shell and Utilities 和 Rationale(解释),除了上边覆盖的接口之外,外定义了一些工具的规范,比如 vi 命令、coreutils 包(
chmod
、cp
等) - Linux 部分接口不符合 POSIX 规范,比如:
execlp()
其实,Richard Stallman 自己后来提到关于的 POSIX 的命名时,是“可移植操作系统” + “ix”:
Having no particular inspiration, I generated a name the unclever way: I took the initials of “portable operating system” and added “ix.” The IEEE adopted this eagerly.
POSIX 究竟是什么
隐藏部分未授权内容…
APUE 上能了解到:
- POSIX 是API规范的结合
- SUS 是 UNIX 的规范,SUS 也是 POSIX 的超集
- Linux 内核是操作控制计算机硬件资源,提供程序运行环境,会提供系统调用接口
RMS 访谈(参考资料)中几点总结:
- POSIX 标准是由 IEEE 发布的可移植操作系统(portable operating system) 规范(specification/spec)
- 如果两个系统都符合 POSIX,那么按照 POSIX 规范来编写的程序就是可移植的
- GNU’s Not Unix 而 POSIX 却是类比 Unix 加的 IX 后缀
- GNU 将 POSIX 视为指南而非权威,遵循(following)而不是遵守(complying) POSIX 标准:一部分 GNU 应用程序符合 POSIX 标准,另一部分 GNU 应用程序的特定功能,要么不符合 POSIX 规范,要么缺少对规范的实现。
- GNU 优先考虑自由(freedom),然后是用户便利(convenience),符合标准优先级更低
- 遵循 POSIX 规范的确更容易移植
APUE 上的一个 erratum
APUE 在 4.12 节文件长度介绍的时候,有一段提到 Linux 上 du
指令报告的是 512 的块数,设置环境变量 POSIXLY_CORRECT
之后报告的是 1024 的块数。其实这两个数值说反了,在 APUE 的勘误表中已经有记录了(http://www.apuebook.com/errata3e.html)。
RMS 在访谈中也提到这个环境变量 POSIXLY_CORRECT
,不使用这个环境变量的默认情况是为了用户的便利,而使用该环境变量的时候是为了合规(POSIX compliant)。
> du a.txt
64 a.txt
> POSIXLY_CORRECT= du a.txt
128 a.txt
参考资料
- POSIX 是什么?让我们听听 Richard Stallman 的诠释(https://kknews.cc/tech/jlj93ky.html)