Jason Pan

理解什么是 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 接口规范吗?还有没有什么比较完整而知名的模块可以加在上边这个表达式的左边?

其实答案是否定的,从两个方面来讲:

其实,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 上能了解到:

RMS 访谈(参考资料)中几点总结:

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

参考资料