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)之前的參考實作非常相似。