POSIX 是对过去应用程序如何实现 UNIX 每个特定部分的描述,还是对 UNIX 必须如何实现的规定性规范?
如果是描述性的,则只有所有包含的实现所共有的功能才是有效的。虽然任何实现都没有实现某个功能,但该功能是“未定义的”。
如果是规定性的:它基于哪个理论框架?数学? C语言?经验?
答案1
这是规定性的法律上的,但主要是描述性的事实上的。
POSIX 是一组可以匹配实现的规范,包括文档发布时已经存在的实现和未来的实现。所以这是规定性的。
实际上,POSIX 一开始主要是作为现有实现的公共子集。所以从这个意义上来说,它主要是描述性的。但 POSIX 有时会强制要求新的行为。最常见的是,对于许多实现中存在但具有不同接口(函数名称、命令行选项等)的功能,POSIX 引入了多个函数和实用程序,例如pax
tar
(和的替代品cpio
,它们在 Unix 变体中非常不同)和各种posix_xxx
功能。 POSIX 还引入了新的常量和命令行选项;例如,对于ps
,“该-A
选项相当于BSD-g
和SVID -e
。由于两个系统不同,因此选择了一种助记符折衷方案。”基本原理部分通常解释为什么包含这个或那个功能,经常提到哪些实现已经具有某个功能,或者为什么在不兼容的实现之间做出或不做出选择。
答案2
POSIX 的目的是描述现有行为,而不是破坏历史行为(不是使历史 UNIX 不兼容),除非历史行为已经可以被视为明确的历史错误。
POSIX 的进一步目的不是引入自己的发明。如果事实证明需要所谓的自己的发明(因为现有的实现对于标准化没有用),则 POSIX 委员会的想法将与各种 UNIX(或程序)版本的作者讨论,以获得最好的解决方案。这样的讨论经常会产生新的实现,这些实现在最终提案被写下来时支持它们。
有一些例外,例如 POSIX 的定义方式getpgrp()
与setpgrp()
10 年前就已经存在的 BSD 接口相冲突。 POSIX 的定义方式getline()
与fexec()
在 GNU libc 引入不兼容接口之前已存在近 30 年的实现完全不兼容。
如果发现现有实现不匹配,则决定使用哪个变体(或者是否引入现有不同实现的混合)并引入 posix 特定名称。例如,线程接口就发生了这种情况,其中posix_xxx()
引入的函数与 Roger Faulkner(Sun Microsystems)之前的参考实现非常相似。