POSIX表示可移植操作系統(tǒng)接口(Portable Operating System Interface of UNIX忌警,縮寫(xiě)為 POSIX ),POSIX標(biāo)準(zhǔn)定義了操作系統(tǒng)應(yīng)該為應(yīng)用程序提供的接口標(biāo)準(zhǔn)拯腮。
20世紀(jì)60年代是大型匿沛、復(fù)雜操作系統(tǒng)盛行的年代龄章,比如IBM的OS/360和Honeywell的Multics系統(tǒng)袜香。OS/360是歷史上最成功的軟件項(xiàng)目之一撕予,而 Multics雖然持續(xù)存在了多年,卻從來(lái)沒(méi)有被廣泛應(yīng)用過(guò)困鸥。貝爾實(shí)驗(yàn)室曾經(jīng)是Multics項(xiàng)目的最初參與者嗅蔬,但是因?yàn)榭紤]到該項(xiàng)目的復(fù)雜性和缺乏進(jìn)展而于1969年退出。鑒于Mutics項(xiàng)目不愉快的經(jīng)歷疾就,一群貝爾實(shí)驗(yàn)室的研究人員Ken Thompson澜术、 Dennis Ritchie、 Doug Mcllroy和 Joe Ossanna猬腰,從1969年開(kāi)始在DEC PDP-7計(jì)算機(jī)上完全用機(jī)器語(yǔ)言編寫(xiě)了一個(gè)簡(jiǎn)單得多的操作系統(tǒng)鸟废。這個(gè)新系統(tǒng)中的很多思想,比如層次文件系統(tǒng)姑荷、作為用戶(hù)級(jí)進(jìn)程的 shell概念盒延,都是來(lái)自于 Multics,只不過(guò)在一個(gè)更小鼠冕、更簡(jiǎn)單的程序包里實(shí)現(xiàn)添寺。1970年,Brian Kernighan給新系統(tǒng)命名為“Unix”懈费,這也是一個(gè)雙關(guān)語(yǔ)计露,暗指“Multics”的復(fù)雜性。1973年用C重新編寫(xiě)其內(nèi)核憎乙,1974年票罐,Unix開(kāi)始正式對(duì)外發(fā)布。
貝爾實(shí)驗(yàn)室以慷慨的條件向?qū)W校提供源代碼泞边,所以Unix在大專(zhuān)院校里獲得了很多支持并得以持續(xù)發(fā)展该押。最有影響的工作發(fā)生在20世紀(jì)70年代晚期到80年代早期,在美國(guó)加州大學(xué)伯克利分校阵谚,研究人員在一系列發(fā)布版本中增加了虛擬內(nèi)存和Internet協(xié)議蚕礼,稱(chēng)為Unix4.xBSD(Berkeley Software Distribution)。與此同時(shí)梢什,貝爾實(shí)驗(yàn)室也在發(fā)布自己的版本闻牡,稱(chēng)為System V Unix。其他廠商的版本绳矩,比如Sun Microsystems的Solaris系統(tǒng),則是從這些原始的BSD和System V版本中衍生而來(lái)罩润。
20世紀(jì)80年代中期,Unix廠商試圖通過(guò)加入新的翼馆、往往不兼容的特性來(lái)使它們的程序與眾不同割以,麻煩也就隨之而來(lái)了。為了阻止這種趨勢(shì)应媚,IEEE(電氣和電子工程師協(xié)會(huì))開(kāi)始努力標(biāo)準(zhǔn)化Unix的開(kāi)發(fā)严沥,后來(lái)由 Richard Stallman命名為“Posix”。結(jié)果就得到了一系列的標(biāo)準(zhǔn)中姜,稱(chēng)作Posix標(biāo)準(zhǔn)消玄。這套標(biāo)準(zhǔn)涵蓋了很多方面跟伏,比如Unix系統(tǒng)調(diào)用的C語(yǔ)言接口、shell程序和工具翩瓜、線程及網(wǎng)絡(luò)編程受扳。最近,一個(gè)被稱(chēng)為“標(biāo)準(zhǔn)Unix規(guī)范”的獨(dú)立標(biāo)準(zhǔn)化工作已經(jīng)與Posix一起創(chuàng)建了統(tǒng)一的Unix系統(tǒng)標(biāo)準(zhǔn)兔跌。這些標(biāo)準(zhǔn)化工作的結(jié)果是Unix版本之間的差異已經(jīng)基本消失勘高。
在 20 世紀(jì) 70~80 年代,AT&T 雖對(duì) UNIX 的實(shí)際源代碼進(jìn)行了版權(quán)保護(hù)坟桅,但卻鼓勵(lì)在系統(tǒng)的接口和語(yǔ)言基礎(chǔ)上進(jìn)行標(biāo)準(zhǔn)化工作华望。例如,AT&T 發(fā)布了 SVID(System V Interface Definition仅乓,系統(tǒng) V 接口定義)赖舟,這成為了 POSIX 及其后續(xù)工作的基礎(chǔ)。后來(lái)夸楣,UNIX 可以說(shuō)相當(dāng)優(yōu)雅地適應(yīng)了網(wǎng)絡(luò)環(huán)境建蹄,雖不那么輕巧卻也充分地適應(yīng)了圖形環(huán)境。再往后裕偿,開(kāi)源運(yùn)動(dòng)的技術(shù)基礎(chǔ)中集成了 UNIX 的基本內(nèi)核接口和許多它獨(dú)特的用戶(hù)級(jí)工具洞慎。
POSIX 標(biāo)準(zhǔn)定義了操作系統(tǒng)應(yīng)該為應(yīng)用程序提供的接口標(biāo)準(zhǔn),是 IEEE 為要在各種 UNIX 操作系統(tǒng)上運(yùn)行的軟件而定義的一系列 API 標(biāo)準(zhǔn)的總稱(chēng)嘿棘,其正式稱(chēng)呼為 IEEE 1003劲腿,而國(guó)際標(biāo)準(zhǔn)名稱(chēng)為 ISO/IEC 9945。POSIX 標(biāo)準(zhǔn)意在期望獲得源代碼級(jí)別的軟件可移植性鸟妙。換句話說(shuō)焦人,為一個(gè) POSIX 兼容的操作系統(tǒng)編寫(xiě)的程序,應(yīng)該可以在任何其它的 POSIX 操作系統(tǒng)(即使是來(lái)自另一個(gè)廠商)上編譯執(zhí)行重父。
POSIX 并不局限于 UNIX花椭。許多其它的操作系統(tǒng),例如 DEC OpenVMS 支持 POSIX 標(biāo)準(zhǔn)房午,尤其是 IEEE Std. 1003.1-1990(1995 年修訂)或 POSIX.1矿辽,POSIX.1 提供了源代碼級(jí)別的 C 語(yǔ)言應(yīng)用編程接口(API)給操作系統(tǒng)的服務(wù)程序,例如讀寫(xiě)文件郭厌。POSIX.1 已經(jīng)被國(guó)際標(biāo)準(zhǔn)化組織(International Standards Organization袋倔,ISO)所接受,被命名為 ISO/IEC 9945-1:1990 標(biāo)準(zhǔn)折柠。
POSIX.1 僅規(guī)定了系統(tǒng)服務(wù)應(yīng)用程序編程接口(API)宾娜,僅概況了基本的系統(tǒng)服務(wù)標(biāo)準(zhǔn)。因此工作組期望對(duì)系統(tǒng)的其他功能也制定出標(biāo)準(zhǔn)扇售。這樣前塔,IEEE POSIX 的工作就開(kāi)始展開(kāi)了嚣艇。剛開(kāi)始有十個(gè)批準(zhǔn)的計(jì)劃在進(jìn)行,有近 300 多人參加每季度為期一周的會(huì)議华弓。著手的工作由命令與工作標(biāo)準(zhǔn)(POSIX.2)食零、測(cè)試方法標(biāo)準(zhǔn)(POSIX.3)、實(shí)時(shí) API(POSIX.4)等该抒。到了 1990 年上半年已經(jīng)有 25 個(gè)計(jì)劃在進(jìn)行,并且有 16 個(gè)工作組參與了進(jìn)來(lái)顶燕。與此同時(shí)凑保,還有一些組織也在指定類(lèi)似的標(biāo)準(zhǔn),如 X/Open涌攻、AT&T欧引、OSF 等。
在上世紀(jì) 90 年代初恳谎,POSIX 標(biāo)準(zhǔn)的制定正處于最后投票敲定階段芝此。也就是 1991~1993 年間,Linux 剛剛起步的時(shí)候因痛,這個(gè) UNIX 標(biāo)準(zhǔn)為 Linux 提供了極為重要的信息婚苹,使得 Linux 能夠在標(biāo)準(zhǔn)的指導(dǎo)下進(jìn)行開(kāi)發(fā),并能夠與絕大多數(shù) UNIX 操作系統(tǒng)兼容鸵膏。在最初的 Linux 內(nèi)核源碼(0.01版膊升、0.11版)中就已經(jīng)為 Linux 系統(tǒng)與 POSIX 標(biāo)準(zhǔn)的兼容做好了準(zhǔn)備工作。在 Linux 0.01 版內(nèi)核 /include/unistd.h 文件中就已經(jīng)定義了幾個(gè)有關(guān) POSIX 標(biāo)準(zhǔn)要求的符號(hào)常數(shù)谭企,而且 Linus 在注釋中已寫(xiě)道:“OK廓译,這也許是個(gè)玩笑,但我正在著手研究它呢”债查。
簡(jiǎn)單總結(jié):
? 完成同一功能非区,不同內(nèi)核提供的系統(tǒng)調(diào)用(也就是一個(gè)函數(shù))是不同的,例如創(chuàng)建進(jìn)程盹廷,linux下是fork函數(shù)征绸,windows下是creatprocess函數(shù)。好俄占,我現(xiàn)在在linux下寫(xiě)一個(gè)程序歹垫,用到fork函數(shù),那么這個(gè)程序該怎么往windows上移植颠放?我需要把源代碼里的fork通通改成creatprocess排惨,然后重新編譯!
? posix標(biāo)準(zhǔn)的出現(xiàn)就是為了解決這個(gè)問(wèn)題碰凶。linux和windows都要實(shí)現(xiàn)基本的posix標(biāo)準(zhǔn)暮芭,linux把fork函數(shù)封裝成posix_fork(隨便說(shuō)的)鹿驼,windows把creatprocess函數(shù)也封裝成posix_fork,都聲明在unistd.h里辕宏。
這樣畜晰,程序員編寫(xiě)普通應(yīng)用時(shí)候,只用包含unistd.h瑞筐,調(diào)用posix_fork函數(shù)凄鼻,程序就在源代碼級(jí)別可移植了。