作業系統介面

POSIX 與 POSIX API(POSIX and the POSIX API)

/ POSIX: PAH-ziks /

想像十幾家車廠依協議一致決定:煞車踏板放右邊、油門在中間、方向盤轉動的方向一致。各家車子在引擎蓋底下仍天差地別,但在其中一輛上學會開車的駕駛,坐進任何一輛都能開。POSIX 就是類 Unix 作業系統的這份協議:一份公開的標準,規定作業系統的介面應該長什麼樣,好讓依它寫成的程式能在許多系統上執行。

POSIX 代表可移植作業系統介面(Portable Operating System Interface),它是一份正式標準,規定一組核心作業系統服務在 C 程式眼中的名稱、引數與行為——像 open()、read()、write()、fork()、pthread_mutex_lock() 這些函式,加上殼層行為與命令列工具。POSIX API 就是這套已定義的函式簽章及其承諾的行為。關鍵在於:POSIX 標準化的是介面、而非實作:Linux、macOS、各種 BSD 等等,內部各以自己的方式實作 POSIX,但它們同意以相同的意義公開相同的呼叫。Linux 尤其大致與 POSIX 相容,這正是為什麼那麼多 Unix 軟體能在這些系統間幾乎不改動就建構並執行。

為何重要:POSIX 是同一套 C 系統程式碼能在類 Unix 平台間可移植的實際原因。如果你只用 POSIX 規定的函式,就能合理期待你的程式在 Linux 與 macOS 上以相同方式編譯與運作。一旦走出 POSIX、用上某系統自家的擴充,你就以可移植性換取那個平台獨有的功能。注意誠實的界限:POSIX 是一份龐大、含可選部分的標準,真實系統實作得並不完美、還會加上非標準的額外功能,而 Windows 並非原生 POSIX——所以「POSIX 相容」是個有用的期待,而非鐵打的保證。

一個只用 open()、read()、write()、close()——全都是 POSIX 呼叫——的程式,通常能在 Linux 與 macOS 上原封不動地編譯與執行。換成只有 Linux 才有的呼叫如 epoll_create(),那份原始碼就無法照原樣在 macOS 上建構了。

守在 POSIX 之內換來可移植性;伸手去用擴充則把它換掉。

POSIX 標準化的是介面、不是內部實作。兩個 POSIX 系統對同一個呼叫可能給出非常不同的效能或邊界情況行為,而許多系統只部分實作 POSIX。「符合 POSIX」是關於可移植性的強烈暗示,而非「一切行為都完全相同」的承諾。

又稱
Portable Operating System InterfacePOSIX standard可移植作業系統介面