自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Posix是什么都不知道,就別說你懂Linux了!

系統(tǒng) Linux
Linux開發(fā)者越來越多,但是仍然有很多人整不明白POSIX是什么。本文就帶著大家來了解一下到底什么是POSIX,了解他的歷史和重要性。

[[412902]]

Linux開發(fā)者越來越多,但是仍然有很多人整不明白POSIX是什么。本文就帶著大家來了解一下到底什么是POSIX,了解他的歷史和重要性。

一、什么是posix?

1. 概念

POSIX:可移植操作系統(tǒng)接口(Portable Operating System Interface of UNIX,縮寫為 POSIX ),

2. 發(fā)布者-IEEE

發(fā)布者為電氣與電子工程師協(xié)會(Institute of Electrical and Electronics Engineers),簡稱IEEE。這個協(xié)會老牛了【該組織在太空、計算機、電信、生物醫(yī)學(xué)、電力及消費性電子產(chǎn)品等領(lǐng)域中都是主要的權(quán)威】!

[[412903]]

POSIX是IEEE為要在各種UNIX操作系統(tǒng)上運行的軟件而定義的一系列API標準的總稱,其正式稱呼為IEEE 1003,而國際標準名稱為ISO/IEC 9945。

POSIX.1 已經(jīng)被國際標準化組織(International Standards Organization,ISO)所接受,被命名為 ISO/IEC 9945-1:1990 標準。

IEEE,總部位于美國紐約,是一個國際性的電子技術(shù)與信息科學(xué)工程師的協(xié)會,也是目前全球最大的非營利性專業(yè)技術(shù)學(xué)會。IEEE致力于電氣、電子、計算機工程和與科學(xué)有關(guān)的領(lǐng)域的開發(fā)和研究,在太空、計算機、電信、生物醫(yī)學(xué)、電力及消費性電子產(chǎn)品等領(lǐng)域已制定了1300多個行業(yè)標準,現(xiàn)已發(fā)展成為具有較大影響力的國際學(xué)術(shù)組織

3. POSIX標準下載

主頁:http://blog.csdn.net/ablo_zhou

很多人聽說了POSIX標準,但標準具體長什么樣,在哪里下載到,則 不清楚?,F(xiàn)在我開放出來,供相關(guān)人員使用。

Single UNIX Specification V3,IEEE Std 1003.1,2004 Edition

標準線上地址:http://www.unix.org/version3/online.html 注冊后可以在線閱讀或者下載。

IEEE和Open Group 的POSIX認證:http://www.opengroup.org/certification/idx/posix.html

相關(guān)頁面:http://www.unix.org/version3/ieee_std.html

二、POSIX歷史

1. 起源

POSIX是Unix的標準。

1974年,貝爾實驗室正式對外發(fā)布Unix。因為涉及到反壟斷等各種原因,加上早期的Unix不夠完善,于是貝爾實驗室以慷慨的條件向?qū)W校提供源代碼,所以Unix在大專院校里獲得了很多支持并得以持續(xù)發(fā)展。

于是出現(xiàn)了好些獨立開發(fā)的與Unix基本兼容但又不完全兼容的OS,通稱Unix-like OS。

包括:

  1. 美國加州大學(xué)伯克利分校的Unix4.xBSD(Berkeley Software Distribution)。
  2. 貝爾實驗室發(fā)布的自己的版本,稱為System V Unix。
  3. 其他廠商的版本,比如Sun Microsystems的Solaris系統(tǒng),則是從這些原始的BSD和System V版本中衍生而來。

20世紀80年代中期,Unix廠商試圖通過加入新的、往往不兼容的特性來使它們的程序與眾不同。

局面非常混亂,麻煩也就隨之而來了。

為了提高兼容性和應(yīng)用程序的可移植性,阻止這種趨勢, IEEE(電氣和電子工程師協(xié)會)開始努力標準化Unix的開發(fā),后來由 Richard Stallman命名為“Posix”。

這套標準涵蓋了很多方面,比如Unix系統(tǒng)調(diào)用的C語言接口、shell程序和工具、線程及網(wǎng)絡(luò)編程。

2. 誰遵循這個標準呢?

首先就是大名鼎鼎的Unix和Linux了,

[[412904]]

除此之外還有蘋果的操作系統(tǒng)也是Unix-based的。

[[412905]]

有了這個規(guī)范,你就可以調(diào)用通用的API了,Linux提供的POSIX系統(tǒng)調(diào)用在Unix上也能執(zhí)行,因此學(xué)習(xí)Linux的底層接口最好就是理解POSIX標準。

Windows從WinNT開始就有兼容POSIX的考慮。這是因為當(dāng)年在要求嚴格的領(lǐng)域,Unix地位比Windows高。為了把Unix用戶拉到Windows陣營,被迫支持POSIX。

現(xiàn)在Win10對 Linux/POSIX 支持好,則是因為Linux已經(jīng)統(tǒng)治了廉價服務(wù)器市場。為了提高Windows的競爭力搞的。

所以一切都是以市場為主導(dǎo)。

3. 支持POSIX-Linux成功的最重要一個因素

Linux之所以能夠成功,有很多因素,但是支持POSIX標準無疑是它能夠快速發(fā)展的最重要的一個因素。

POSIX 標準的制定最后投票敲定階段大概是 1991~1993 年間,而此時正是Linux 剛剛起步的時候,這個 UNIX 標準為 Linux 提供了極為重要的信息,使得 Linux 能夠在標準的指導(dǎo)下進行開發(fā),并能夠與絕大多數(shù) UNIX 操作系統(tǒng)兼容。

在最初的 Linux 內(nèi)核源碼(0.01版、0.11版)中就已經(jīng)為 Linux 系統(tǒng)與 POSIX 標準的兼容做好了準備工作。

在 Linux 0.01 版內(nèi)核 /include/unistd.h 文件中就已經(jīng)定義了幾個有關(guān) POSIX 標準要求的符號常數(shù),而且 Linus 在注釋中已寫道:“OK,這也許是個玩笑,但我正在著手研究它呢”。

正是由于Linux支持POSIX標準,無數(shù)可以在unix上運行的程序都陸續(xù)的移植到Linux上,而此時unix因為版權(quán)問題,官司打的不可開交,使得Linux后來者居上。

時也命也!

下面是祖師爺Linus當(dāng)年申請POSIX標準的郵件:

  1. 來自:torvalds@klaava.Helsinki.Fi(林納斯·托瓦茲) 
  2. 討論組:comp.os.minix 
  3. 主題:Gcc-1.40和一個有關(guān)POSIX的問題 
  4. 信息名稱: 1991 Jul 3, 100050.9886@klaava.Helsinki.Fi 
  5. 日期: 1991年7月3日, 格林威治時間10: 00: 50 
  6. 各位網(wǎng)友好! 
  7. 由于我現(xiàn)在正在MINIX系統(tǒng)下做一個項目, 對POSIX標準很感興趣。 有誰能向我提供 
  8. 一個(最好) 是機器可讀形式的最新的POSIX規(guī)則? 能有FTP地址就更好了。 

而Linus也在《只是為了好玩》中講述了POSIX的重要性:

  1. POSIX標準是一個可以適用于數(shù)以百計的UNIX系統(tǒng)呼叫中的任意一個的一套冗長規(guī)則, 計算機要執(zhí)行任務(wù)(從讀、 寫、 開機和關(guān)機開始) 就需要這個標準。  
  2.  
  3. POSIX則是指一個UNIX的標準體系, 或一個由來自不同公司的代表所組成的一個組織, 希望按照一個共同的標準進行運作。 對于程序員開發(fā)的在該操作系統(tǒng)下的新應(yīng)用軟件或開發(fā)應(yīng)用軟件的新版本而言, 標準是極其重要的。 從POSIX這樣的系統(tǒng)呼叫(system call) , 尤其是重要的呼叫(call) 中, 我可以獲得一個操作系統(tǒng)應(yīng)該具有哪些功能的一個單子; 然后我就可以通過自己的方式在自己的系統(tǒng)中實現(xiàn)每一個功能。 通過編寫出這些標準, 我的系統(tǒng)軟件的源代碼將可以被別人使用, 以開發(fā)新的應(yīng)用軟件。 
  4.  
  5. 當(dāng)時我并不知道我本可以直接從POSIX公司買到這些規(guī)則的軟盤, 但這無所謂。 哪怕我能買得起, 什么東西運到芬蘭, 往往會需要很長的時間。 我不愿等上那么久, 因此我四處搜求一個能從FTP地址上直接下載的版本。 
  6.  
  7. 沒有人給我提供能找到POSI標準的來源。 于是我開始了計劃B。 
  8.  
  9. 我從學(xué)校找到運行sun器(sun server)的sun微系統(tǒng)版的UNIX手冊。 該手冊中有一個完全可以湊合使用的系統(tǒng)呼叫的基本版本。 從用戶手冊中能看出系統(tǒng)呼叫的主要功能, 以及為完成這些功能所需要完成的步驟。 但是, 從中看不出具體的方法, 而只是標明了最終的結(jié)果。 于是我便著手從安德魯·塔南鮑姆的書中和別的材料中收集一些系統(tǒng)呼叫。  
  10.  
  11. 最終有人給我寄來了那幾卷厚厚的POSIX標準。 

三、可移植性

聊到POSIX,那我們就不得不說說到底什么是可移植性,在講可移植性之前,我們先來了解庫函數(shù)和系統(tǒng)調(diào)用的區(qū)別。

Linux下對文件操作有兩種方式:系統(tǒng)調(diào)用(system call)和庫函數(shù)調(diào)用(Library functions)。

1. 系統(tǒng)調(diào)用

系統(tǒng)調(diào)用是通向操作系統(tǒng)本身的接口,是面向底層硬件的。通過系統(tǒng)調(diào)用,可以使得用戶態(tài)運行的進程與硬件設(shè)備(如CPU、磁盤、打印機等)進行交互,是操作系統(tǒng)留給應(yīng)用程序的一個接口。

2. 庫函數(shù)

庫函數(shù)(Library function)是把函數(shù)放到庫里,供別人使用的一種方式。

方法是把一些常用到的函數(shù)編完放到一個文件里,供不同的人進行調(diào)用。一般放在.lib文件中。

庫函數(shù)調(diào)用則是面向應(yīng)用開發(fā)的,庫函數(shù)可分為兩類,

  1. 一類是C語言標準規(guī)定的庫函數(shù),
  2. 一類是編譯器特定的庫函數(shù)。

(由于版權(quán)原因,庫函數(shù)的源代碼一般是不可見的,但在頭文件中你可以看到它對外的接口)。

glibc 是 Linux 下使用的開源的標準 C 庫,它是 GNU 發(fā)布的 libc 庫,即運行時庫。這些基本函數(shù)都是被標準化了的,而且這些函數(shù)通常都是用匯編直接實現(xiàn)的。

glibc 為程序員提供豐富的 API(Application Programming Interface),這些API都是遵循POSIX標準的,API的函數(shù)名,返回值,參數(shù)類型等都必須按照POSIX標準來定義。

POSIX兼容也就指定這些接口函數(shù)兼容,但是并不管API具體如何實現(xiàn)。

3. 庫函數(shù)API和系統(tǒng)調(diào)用的區(qū)別

如上圖所示:

(1) 庫函數(shù)是語言或應(yīng)用程序的一部分,而系統(tǒng)調(diào)用是內(nèi)核提供給應(yīng)用程序的接口,屬于系統(tǒng)的一部分

(2) 庫函數(shù)在用戶地址空間執(zhí)行,系統(tǒng)調(diào)用是在內(nèi)核地址空間執(zhí)行,庫函數(shù)運行時間屬于用戶時間,系統(tǒng)調(diào)用屬于系統(tǒng)時間,庫函數(shù)開銷較小,系統(tǒng)調(diào)用開銷較大

(3) 系統(tǒng)調(diào)用依賴于平臺,庫函數(shù)并不依賴

系統(tǒng)調(diào)用是為了方便使用操作系統(tǒng)的接口,而庫函數(shù)則是為了人們編程的方便。

庫函數(shù)調(diào)用與系統(tǒng)無關(guān),不同的系統(tǒng),調(diào)用庫函數(shù),庫函數(shù)會調(diào)用不同的底層函數(shù)實現(xiàn),因此可移植性好。

4. 程序的可移植性及其本質(zhì)

那么目標代碼和啟動代碼是怎么生成的呢?答案是編譯器。

編程語言編寫的程序首先要被編譯器編譯成目標代碼(0、1代碼),然后在目標代碼的前面插入啟動代碼,最終生成了一個完整的程序。

要注意的是,程序中為訪問特定設(shè)備(如顯示器)或者操作系統(tǒng)(如windows xp 的API)的特殊功能而專門編寫的部分通常是不能移植的。

綜上所述,一個編程語言的可移植性取決于

  1. 不同平臺編譯器的數(shù)量
  2. 對特殊硬件或操作系統(tǒng)的依賴性

移植是基于操作系統(tǒng)的。但是這個時候,我們需要注意一點:基于各種操作系統(tǒng)平臺不同,應(yīng)用程序在二級制級別是不能直接移植的。

我們只能在代碼層去思考可移植問題,在API層面上由于各個操作系統(tǒng)的命名規(guī)范、系統(tǒng)調(diào)用等自身原因,在API層面上實現(xiàn)可移植也是不大可能的。

在各個平臺下,我們默認C標準庫中的函數(shù)都是一樣的,這樣基本可以實現(xiàn)可移植。但是對于C庫本身而言,在各種操作系統(tǒng)平臺下其內(nèi)部實現(xiàn)是完全不同的,也就是說C庫封裝了操作系統(tǒng)API在其內(nèi)部的實現(xiàn)細節(jié)。

因此,C語言提供了我們在代碼級的可移植性,即這種可移植是通過C語言這個中間層來完成的。

例如在我們的代碼中下功夫。以下代碼可以幫助我們實現(xiàn)各平臺之間的可移植:

  1. #ifdef _WINDOWS_ 
  2.        CreateThread();      //windows下線程的創(chuàng)建 
  3. #else 
  4.        Pthread_create();    //Linux下線程的創(chuàng)建 
  5. #endif 

對于頭文件,也使用同樣的預(yù)編譯宏來實現(xiàn)。如:

  1. #ifndef _WINDOWS_ 
  2.        #include <windows.h> 
  3. #else 
  4.        #include <thread.h> 
  5. #endif 

這樣就可以實現(xiàn)代碼的可移植了。在編譯的時候只要通過#define就可以選擇在那個平臺下完成程序的編譯。

綜上所述,我們都是將C,C++等各種語言當(dāng)作中間層,以實現(xiàn)其一定程度上的可移植。如今,語言的跨平臺的程序都是以這樣的方式實現(xiàn)的。但是在不同的平臺下,仍需要重新編譯。

5. 系統(tǒng)開銷

使用系統(tǒng)調(diào)用會影響系統(tǒng)的性能,在執(zhí)行調(diào)用時的從用戶態(tài)切換到內(nèi)核態(tài),再返回用戶態(tài)會有系統(tǒng)開銷。

為了減少開銷,因此需要減少系統(tǒng)調(diào)用的次數(shù),并且讓每次系統(tǒng)調(diào)用盡可能的完成多的任務(wù)。

硬件也會限制對底層系統(tǒng)調(diào)用一次所能寫的數(shù)據(jù)塊的大小。

為了給設(shè)備和文件提供更高層的接口,Linux系統(tǒng)提供了一系列的標準函數(shù)庫。

使用標準庫函數(shù),可以高效的寫任意長度的數(shù)據(jù)塊,庫函數(shù)在數(shù)據(jù)滿足數(shù)據(jù)塊長度要求時安排執(zhí)行底層系統(tǒng)調(diào)用。

一般地,操作系統(tǒng)為了考慮實現(xiàn)的難度和管理的方便,它只提供一少部分的系統(tǒng)調(diào)用,這些系統(tǒng)調(diào)用一般都是由C和匯編混合編寫實現(xiàn)的,其接口用C來定義,而具體的實現(xiàn)則是匯編,這樣的好處就是執(zhí)行效率高,而且,極大的方便了上層調(diào)用。

隨著系統(tǒng)提供的這些庫函數(shù)把系統(tǒng)調(diào)用進行封裝或者組合,可以實現(xiàn)更多的功能,這樣的庫函數(shù)能夠?qū)崿F(xiàn)一些對內(nèi)核來說比較復(fù)雜的操作。

比如,read()函數(shù)根據(jù)參數(shù),直接就能讀文件,而背后隱藏的比如文件在硬盤的哪個磁道,哪個扇區(qū),加載到內(nèi)存的哪個位置等等這些操作,程序員是不必關(guān)心的,這些操作里面自然也包含了系統(tǒng)調(diào)用。

而對于第三方的庫,它其實和系統(tǒng)庫一樣,只是它直接利用系統(tǒng)調(diào)用的可能性要小一些,而是利用系統(tǒng)提供的API接口來實現(xiàn)功能(API的接口是開放的)。

四、舉例

如下圖是Linux系統(tǒng)調(diào)用的大概流程。

當(dāng)應(yīng)用程序調(diào)用printf()函數(shù)時,printf函數(shù)會調(diào)用C庫中的printf,繼而調(diào)用C庫中的write,C庫最后調(diào)用內(nèi)核的write()。

而另一些則不會使用系統(tǒng)調(diào)用,比如strlen, strcat, memcpy等。

printf函數(shù)執(zhí)行過程中,程序運行狀態(tài)切換如下:

  1. 用戶態(tài)–>系統(tǒng)調(diào)用–>內(nèi)核態(tài)–>返回用戶態(tài) 

printf函數(shù)、glibc庫和系統(tǒng)調(diào)用在系統(tǒng)中關(guān)系圖如下:

實例代碼如下:

  1. 1 #include <stdio.h> 
  2. 2  
  3. 3  
  4. int main(int argc, char **argv) 
  5. 5 { 
  6. 6     printf("yikoulinux");    
  7. 7     return 0; 
  8. 8 }    

編譯執(zhí)行

  1. root@ubuntu:/home/peng/test# gcc 123.c -o run 
  2. root@ubuntu:/home/peng/test# strace ./run 

如執(zhí)行結(jié)果可知:我們的程序雖然只有一個printf函數(shù),但是在執(zhí)行過程中,我們前后調(diào)用了execve、access、open、fstat、mmap、brk、write等系統(tǒng)調(diào)用。其中write系統(tǒng)調(diào)用會把字符串:yikoulinux通過設(shè)備文件1,發(fā)送到驅(qū)動,該設(shè)備節(jié)點對應(yīng)終端stdout。

【注意】運行程序前加上strace,可以追蹤到函數(shù)庫調(diào)用過程

本文轉(zhuǎn)載自微信公眾號「一口Linux」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系一口Linux公眾號。

 

責(zé)任編輯:姜華 來源: 一口Linux
相關(guān)推薦

2019-12-24 09:49:02

微軟英語瀏覽器

2021-11-12 10:05:19

跳表BAT面試

2018-08-30 09:56:38

2023-01-05 23:18:06

CPU線程

2011-09-15 17:10:41

2020-12-21 09:00:04

MySQL緩存SQL

2020-12-21 09:44:53

MySQL查詢緩存數(shù)據(jù)庫

2019-04-11 09:37:50

2018-07-25 17:05:25

Windows電腦數(shù)碼

2020-08-11 11:20:49

Linux命令使用技巧

2019-07-12 15:28:41

緩存數(shù)據(jù)庫瀏覽器

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2019-10-28 08:44:29

Code Review代碼團隊

2022-04-12 09:04:57

前端監(jiān)控數(shù)據(jù)采集

2017-12-15 13:44:22

2022-10-12 08:22:44

Guava工具Collection

2022-06-18 23:03:05

Seata分布式事務(wù)

2017-12-19 23:12:53

2019-06-05 15:20:00

MongoDBNoSQL數(shù)據(jù)庫
點贊
收藏

51CTO技術(shù)棧公眾號