什么是 POSIX,它为什么重要?这是一个您可能在技术文档中看到的术语,但它常常淹没在大量的技术首字母缩略词和以 X 结尾的术语中。我给 理查德·斯托曼博士(在黑客圈中更广为人知的名字是 RMS)发了电子邮件,以了解更多关于该术语的起源及其背后的概念。
理查德·斯托曼说,“开放”和“封闭”是分类软件的错误方式。斯托曼将程序分为尊重自由(“自由”或“liberté”)和践踏自由(“非自由”或“专有”)。开源讨论通常鼓励某些实践,是为了实际优势,而不是作为一种道德命令。
斯托曼于 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: 我想是这样的,但我早在 20 世纪 80 年代就决定不花时间将软件移植到 GNU 以外的系统。我专注于推进 GNU 系统,使其不再需要使用任何非自由软件,并将 GNU 程序移植到非 GNU 类系统的任务留给任何想在这些系统上运行它们的人。
Seth: POSIX 对软件自由重要吗?
RMS: 从根本上来说,它没有区别。但是,POSIX 和 ISO C 的标准化无疑使 GNU 系统更容易迁移,这帮助我们更快地朝着将用户从非自由软件中解放出来的目标前进。这在 20 世纪 90 年代初实现了,当时 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 循环 和作为进入 并行 处理的入口的有用工具。
一些便利功能从 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(您 /usr/bin 目录中的 gawk 命令,可能是符号链接 awk 的目标)的维护者 Arnold Robbins 说,gawk 和 mawk(另一个 GPL awk 实现)允许 RS 成为正则表达式,当 RS 的长度大于 1 时就是这种情况。这还不是 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 条评论