什么是 POSIX?它为何重要?这是一个您可能在技术文档中看到的术语,但它经常淹没在大量的技术首字母缩略词和以 X 结尾的术语中。我通过电子邮件联系了 Richard Stallman 博士(在黑客圈中更广为人知的名字是 RMS),以了解有关该术语的起源及其背后概念的更多信息。
理查德·斯托曼认为“开放”和“封闭”是软件分类的错误方式。斯托曼将程序分为尊重自由(“自由”或“liber”)和践踏自由(“非自由”或“专有”)两类。开源讨论通常鼓励某些实践,是为了实际优势,而不是作为一种道德命令。
斯托曼于 1984 年发起的自由软件运动认为,不仅仅是优势受到威胁。计算机用户应该控制他们的计算,因此拒绝用户控制的程序是对用户的不公正,应该被拒绝和消除。为了让用户拥有控制权,程序必须赋予他们 四项基本自由
- 出于任何目的,随心所欲运行程序的自由(自由 0)。
- 研究程序工作原理并对其进行更改以使其按照您的意愿进行计算的自由(自由 1)。访问源代码是此项自由的先决条件。
- 重新分发副本以帮助他人的自由(自由 2)。
- 分发您修改版本的副本给他人的自由(自由 3)。通过这样做,您可以让整个社区有机会从您的更改中受益。访问源代码是此项自由的先决条件。
关于 POSIX
Seth: POSIX 标准是 IEEE 发布的一份文档,描述了“可移植操作系统”。只要开发人员编写的程序符合此描述,他们就生成了一个符合 POSIX 标准的程序。在科技行业,我们称之为“规范”或简称“spec”。就技术术语而言,这在很大程度上是可以理解的,但是什么使操作系统“可移植”?
RMS:我认为应该是接口是可移植的(在系统之间),而不是任何一个系统。实际上,内部不同的各种系统确实支持 POSIX 接口规范的各个部分。
Seth:因此,如果两个系统都具有符合 POSIX 标准的程序,那么它们可以相互进行假设,从而使它们知道如何相互“对话”。我读到“POSIX”这个名字是您提出的。您是如何想到这个术语的,以及它是如何被 IEEE 采纳的?
RMS:IEEE 已经完成了规范的制定,但没有简洁的名称。标题上写着类似“可移植操作系统接口”之类的东西,虽然我不记得确切的措辞了。委员会将“IEEEIX”作为简洁的名称。我认为这不是一个好的选择。它发音难听——听起来像一声恐怖的尖叫,“Ayeee!”——所以我预计人们会称这个规范为“Unix”。
由于 GNU's Not Unix,并且它旨在取代 Unix,我不希望人们将 GNU 称为“Unix 系统”。因此,我提出了一个人们可能实际使用的简洁名称。由于没有特别的灵感,我以一种笨拙的方式生成了一个名称:我取了“portable operating system”的首字母,并添加了“ix”。IEEE 欣然采纳了这一点。
Seth:POSIX 缩写中的“操作系统”是指仅 Unix 和类 Unix 系统(如 GNU)吗?还是旨在涵盖所有操作系统?
RMS:抽象地说,“操作系统”一词涵盖了与 Unix 完全不同、与 POSIX 规范完全不接近的系统。但是,该规范是为非常类似于 Unix 的系统设计的;只有这样的系统才符合 POSIX 规范。
Seth:您是否参与审查或更新当前的 POSIX 标准?
RMS:现在没有。
Seth:GNU Autotools 工具链在使应用程序更易于移植方面做了很多工作,至少在构建和安装时是这样。Autotools 是构建可移植基础设施的重要组成部分吗?
RMS:是的,因为即使在遵循 POSIX 的系统之间,也存在许多细微的差异。Autotools 使程序更容易适应这些差异。顺便说一句,如果有人想帮助开发 Autotools,请给我发电子邮件。
Seth:我猜想,当 GNU 刚开始让人们意识到摆脱专有技术的(非)Unix 是可能的时候,关于自由软件如何协同工作一定存在清晰度的空白。
RMS:我不认为存在任何空白或任何不确定性。我只是要遵循 BSD 的接口。
Seth:一些 GNU 应用程序符合 POSIX 标准,而另一些应用程序则具有 POSIX 规范中没有的 GNU 特定功能,或者缺少规范要求的功能。POSIX 合规性对 GNU 应用程序有多重要?
RMS:遵循标准在很大程度上是为了服务用户。我们不将标准视为权威,而是将其视为可能对遵循有用的指南。因此,我们谈论的是遵循标准,而不是“遵守”标准。请参阅 GNU 编码标准中的 非 GNU 标准 部分。
我们努力在大多数问题上与标准兼容,因为在大多数问题上,这最能服务用户。但是,偶尔也会有例外。
例如,POSIX 规定某些实用程序以 512 字节为单位测量磁盘空间。我要求委员会将其更改为 1K,但委员会拒绝了,称官僚规则迫使选择 512。我不记得有多少尝试来论证用户会对这个决定感到满意。
由于 GNU 的第二个优先事项是用户的便利性(仅次于用户的自由),因此我们使 GNU 程序默认以 1K 的块为单位测量磁盘空间。
但是,为了防御竞争对手可能声称这种偏差使 GNU“不合规”的潜在攻击,我们实施了可选模式,这些模式使程序遵循 POSIX 和 ISO C 标准达到了荒谬的程度。对于 POSIX,设置环境变量 POSIXLY_CORRECT 会使 POSIX 指定的程序以 512 字节为单位列出磁盘空间。如果有人知道实际使用 POSIXLY_CORRECT 或其 GCC 对应物 --pedantic 的案例,并且为某些用户提供了实际好处,请告诉我。
Seth:符合 POSIX 标准的自由软件项目是否更容易移植到其他类 Unix 系统?
RMS:我想是这样的,但我早在 1980 年代就决定不花时间将软件移植到 GNU 以外的系统。我专注于推进 GNU 系统,使其无需使用任何非自由软件,并将 GNU 程序移植到非 GNU 类系统的工作留给任何想在这些系统上运行它们的人。
Seth:POSIX 对软件自由重要吗?
RMS:从根本上来说,它没有任何区别。但是,POSIX 和 ISO C 的标准化确实使 GNU 系统更容易迁移,这帮助我们更快地朝着将用户从非自由软件中解放出来的目标迈进。这在 1990 年代初期就实现了,当时 Linux 被制作为自由软件,然后填补了 GNU 中的内核形状的空白。
POSIX 采纳的 GNU 创新
我还问了斯托曼博士,是否有任何 GNU 特定的创新或约定后来被采纳为 POSIX 标准。他记不清具体的例子,但好心地代表我给几位开发人员发了电子邮件。
开发人员 Giacomo Catenazzi、James Youngman、Eric Blake、Arnold Robbins 和 Joshua Judson Rosen 都回复了,回忆了之前的 POSIX 迭代以及仍在进行的迭代。POSIX 是一个“活的”标准,因此行业专业人士不断对其进行更新和审查,许多从事 GNU 项目的开发人员都建议将 GNU 功能纳入其中。
为了历史趣味,以下是一些已进入 POSIX 的流行 GNU 功能。
Make
一些 GNU Make 功能已被采纳到 POSIX 的 make 定义中。相关的规范为从现有实现中借用的功能提供了详细的归属。
Diff 和 patch
diff 和 patch 命令都直接从这些工具的 GNU 版本中添加了 -u 和 -U 选项。
C 库
GNU C 库 glibc 的许多功能已被 POSIX 采纳。谱系有时难以追溯,但 James Youngman 写道
“我非常肯定 ISO C 的许多功能都是由 GCC 开创的。例如,_Noreturn 是 C11 中的新功能,但 GCC-1.35 具有此功能(一个在函数声明中使用了 volatile 修饰符)。另外——虽然我不确定——GCC-1.35 支持可变长度数组,这似乎与现代 C 的一致性数组非常相似。”
Giacomo Catenazzi 引用了 Open Group 的 strftime 文章,并指出了此归属:“这基于某些版本的 GNU libc 的 strftime() 中的一项功能。”
Eric Blake 指出,getline() 和各种基于区域设置的 *_l() 函数肯定是 GNU 开创的。
Joshua Judson Rosen 补充说,他清楚地记得在目睹旨在用于完全不同操作系统的代码中出现奇怪的、熟悉的 GNU 式行为后,对 getline 函数的采用印象深刻。
“等等……那是 GNU 特有的……不是吗?哦——显然不再是了。”
Rosen 向我指出了 getline 手册页,其中写道
getline() 和 getdelim() 最初都是 GNU 扩展。它们已在 POSIX.1-2008 中标准化。
Eric Blake 向我发送了可能在下一个 POSIX 修订版(代号 Issue 8,目前计划在 2021 年左右发布)中添加的其他扩展列表
用户空间扩展
POSIX 不仅为开发人员定义了函数和功能。它还为用户空间定义了标准行为。
ls
-A 选项用于从 ls 命令的结果中排除 .(表示当前位置)和 ..(表示返回上一级目录的机会)符号。这已在 POSIX 2008 中采用。
find
find 命令是用于临时 for 循环 和作为 parallel 处理的入口的有用工具。
一些便利功能从 GNU 进入了 POSIX,包括 -path 和 -perm 选项。
-path 选项允许您过滤与文件系统路径模式匹配的搜索结果,自 1996 年之前(findutil 的 Git 存储库中的最早记录)起,该选项已在 GNU 版本的 find 中提供。James Youngman 指出,HP-UX 也很早就有了这个选项,因此它到底是 GNU 还是 HP-UX 的创新(或两者兼而有之)尚不确定。
-perm 选项允许您按文件权限过滤搜索结果。这在 1996 年之前就已在 GNU 版本的 find 中,并在后来的 POSIX 标准“IEEE Std 1003.1, 2004 Edition”中出现。
xargs 命令是 findutils 包的一部分,在 1996 年之前就有一个 -p 选项,用于将 xargs 置于交互模式(提示用户是否继续),并且它在“IEEE Std 1003.1, 2004 Edition”中进入 POSIX。
Awk
GNU awk 的维护者 Arnold Robbins(您 /usr/bin 目录中的 gawk 命令,可能是符号链接 awk 的目标)表示,当 RS 的长度大于 1 时,gawk 和 mawk(另一个 GPL awk 实现)允许 RS 为正则表达式。这还不是 POSIX 中的功能,但有 迹象表明它将会成为
扩展正则表达式中 NUL 字符导致的不确定行为允许 GNU gawk 程序将来扩展以处理二进制数据。
使用多字符 RS 值导致的不明确行为是为了允许将来可能基于用于记录分隔符的扩展正则表达式进行扩展。历史实现采用字符串的第一个字符并忽略其他字符。
这是一个重要的增强功能,因为 RS 符号定义了记录之间的分隔符。它可能是逗号、分号或破折号或任何此类字符,但如果它是一个字符序列,则除非您在 gawk 或 mawk 中工作,否则仅使用第一个字符。想象一下解析 IP 地址文档,记录由省略号(连续三个点)分隔,结果却在每个 IP 地址的每个点处进行解析。
Mawk 最先支持该功能,但它在几年内没有维护者,这使得 gawk 承担了重任。(Mawk 自那以后获得了一位新的维护者,因此可以说,将此功能推向集体期望可以共享功劳。)
POSIX 规范
总的来说,Giacomo Catenzzi 指出,“……由于 GNU 实用程序使用如此广泛,许多其他选项和行为都得到了统一。在 shell 的每次更改中,Bash 都被用作比较(作为一等公民)。”当某项内容被纳入 POSIX 规范时,没有要求引用 GNU 或任何其他影响,并且可以安全地假设对 POSIX 的影响来自许多来源,GNU 只是其中之一。
POSIX 的意义在于共识。一群技术专家共同努力制定通用规范,供数百名不同的开发人员共享,这为软件独立性以及开发人员和用户自由的更大运动增添了力量。
4 条评论