什么是 POSIX?Richard Stallman 解释

了解计算机自由的先驱者对操作系统兼容性标准背后的解释。
206 位读者喜欢这篇文章。
We don't make software for free, we make it for freedom

Opensource.com

什么是 POSIX,它为什么重要?这是一个你可能在技术文档中看到的术语,但它经常迷失在大量的技术首字母缩略词和以 X 结尾的术语中。我给 Richard Stallman 博士(在黑客圈中更广为人知的名字是 RMS)发了电子邮件,以了解更多关于该术语的起源及其背后的概念。

Richard Stallman 说,“开放”和“封闭”是分类软件的错误方式。Stallman 将程序分为尊重自由的(“自由”或 “libre”)和践踏自由的(“非自由”或“专有”)。开源讨论通常鼓励某些实践是为了实际优势,而不是作为一种道德命令。

Stallman 在 1984 年发起的自由软件运动认为,重要的不仅仅是优势。计算机用户应该拥有对其计算的控制权,因此拒绝用户控制权的程序是一种应该被拒绝和消除的不公正现象。为了让用户拥有控制权,程序必须赋予他们四项基本自由

  • 随心所欲地运行程序的自由,用于任何目的(自由 0)。
  • 研究程序工作原理并更改它的自由,使其按照您的意愿进行计算(自由 1)。访问源代码是此项自由的先决条件。
  • 重新分发副本以便您可以帮助他人的自由(自由 2)。
  • 向他人分发修改后版本副本的自由(自由 3)。通过这样做,您可以让整个社区有机会从您的更改中受益。访问源代码是此项自由的先决条件。

关于 POSIX

Seth:POSIX 标准是 IEEE 发布的一份文档,描述了一个“可移植操作系统”。只要开发人员编写的程序符合此描述,他们就制作了一个符合 POSIX 标准的程序。在科技行业,我们将其简称为“规范”(specification)或“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:我想是这样的,但我决定在 20 世纪 80 年代不花时间将软件移植到 GNU 以外的系统。我专注于推进 GNU 系统,使其不再需要使用任何非自由软件,并将 GNU 程序移植到类非 GNU 系统的工作留给任何想在这些系统上运行它们的人。

Seth:POSIX 对软件自由重要吗?

RMS:从根本上讲,它没有任何区别。但是,POSIX 和 ISO C 的标准化确实使 GNU 系统更易于迁移,这帮助我们更快地朝着将用户从非自由软件中解放出来的目标迈进。这在 20 世纪 90 年代初实现,当时 Linux 被制成自由软件,然后填补了 GNU 中内核形状的空白。

POSIX 采纳的 GNU 创新

我还询问了 Stallman 博士,是否有任何 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

diffpatch 命令都直接从这些工具的 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 命令是用于 ad hoc for 循环的有用工具,也是进入 并行 处理的入口。

一些便利功能从 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(即 gawk 命令,通常位于您的 /usr/bin 目录中,可能是符号链接 awk 的目标位置)的维护者 Arnold Robbins 表示,gawkmawk(另一个 GPL awk 实现)允许 RS 为正则表达式,当 RS 的长度大于 1 时就是这种情况。这还不是 POSIX 中的一项功能,但有迹象表明它将成为

扩展正则表达式中 NUL 字节导致的行为未定义,这为 GNU gawk 程序处理二进制数据提供了未来的扩展可能性。

使用多字符 RS 值导致的未指定行为是为了允许未来基于用于记录分隔符的扩展正则表达式进行扩展。 历史实现会采用字符串的第一个字符并忽略其余字符。

这是一项重要的增强功能,因为 RS 表示法定义了记录之间的分隔符。 它可能是逗号、分号或破折号或任何此类字符,但如果它是字符序列,则除非您在 gawkmawk 中工作,否则仅使用第一个字符。 想象一下解析一个 IP 地址文档,记录由省略号(连续三个点)分隔,结果却在每个 IP 地址的每个点处进行了解析。

Mawk 最先支持此功能,但它 多年来一直没有维护者,使得 gawk 来承担重任。(Mawk 后来获得了一位新的维护者,因此可以说,将此功能推向集体期望应该归功于两者。)

POSIX 规范

总的来说,Giacomo Catenzzi 指出,“……因为 GNU 实用程序被大量使用,许多其他选项和行为都得到了统一。 shell 的每一次更改,Bash 都被用作比较(作为一等公民)。” 当某些内容被纳入 POSIX 规范时,没有要求引用 GNU 或任何其他影响,并且可以安全地假设 POSIX 的影响来自许多来源,而 GNU 只是其中之一。

POSIX 的意义在于共识。 一群技术专家共同努力制定通用规范,供数百名不同的开发人员共享,这为软件独立性以及开发人员和用户自由的更大运动增添了力量。

Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。 他曾在电影和计算机行业工作,并且经常同时进行。

4 条评论

还有谁比 RMS 更擅长用如此简单的方式解释 POSIX ?! 感谢 Kenlon 先生的精彩采访?

我想我对 POOSIX 的致敬是在我的软件中包含了 stdlib 并使用了 EXIT_SUCCESS 和 EXIT_FAILURE 作为标准返回代码,而不是发明其他的东西。

知识共享许可协议本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.