poll方法的基本概念

2021-08-20 18:28:49 字數 3689 閱讀 1237

在上篇部落格中,我們詳細了解了關於select介面的用法,在學習poll函式之前,我們先對select函式的內容做乙個簡單的回顧:

select優點:

目前幾乎在所有的平台上支援,其良好跨平台支援也是它的乙個優點

select缺點:

(1)每次呼叫 select(),都需要把 fd 集合從使用者態拷貝到核心態,這個開銷在 fd 很多時會很大,同時每次呼叫 select() 都需要在核心遍歷傳遞進來的所有 fd,這個開銷在 fd 很多時也很大。

(2)單個程序能夠監視的檔案描述符的數量存在最大限制,在 linux 上一般為 1024,可以通過修改巨集定義甚至重新編譯核心的方式提公升這一限制,但是這樣也會造成效率的降低

(3)select函式在每次呼叫之前都要對引數進行重新設定,這樣做比較麻煩,而且會降低效能

select() 和 poll() 系統呼叫的本質一樣,poll() 的機制與 select() 類似,與 select() 在本質上沒有多大差別,管理多個描述符也是進行輪詢,根據描述符的狀態進行處理。

引數解釋:

(1)fds:指向乙個結構體陣列的第0個元素的指標,每個陣列元素都是乙個struct pollfd結構,用於指定測試某個給定的fd的條件

(2)nfds:表示fds結構體陣列的長度

(3)timeout:表示poll函式的超時時間,單位是毫秒

函式功能:

監視並等待多個檔案描述符的屬性變化

函式返回值:

(1)返回值小於0,表示出錯

(2)返回值等於0,表示poll函式等待超時

(3)返回值大於0,表示poll由於監聽的檔案描述符就緒返回,並且返回結果就是就緒的檔案描述符的個數。

在該函式的第乙個引數中,我們知道存放檔案描述符的陣列中每乙個元素都是乙個struct pollfd結構,那麼pollfd結構到底是什麼樣的呢?我們來一起了解一下:

結構體內容:

成員變數說明:

(1)fd:每乙個 pollfd 結構體指定了乙個被監視的檔案描述符,可以傳遞多個結構體,指示 poll() 監視多個檔案描述符。

(2)events:表示要告訴作業系統需要監測fd的事件(輸入、輸出、錯誤),每乙個事件有多個取值

(3)revents:revents 域是檔案描述符的操作結果事件,核心在呼叫返回時設定這個域。events 域中請求的任何事件都可能在 revents 域中返回。

events&revents的取值如下:事件

描述是否可作為輸入(events)

是否可作為輸出(revents)

pollin

資料可讀(包括普通資料&優先資料)是是

pollout

資料可寫(普通資料&優先資料)是是

pollrdnorm

普通資料可讀是是

pollrdband

優先順序帶資料可讀(linux不支援)是是

pollpri

高優先順序資料可讀,比如tcp帶外資料是是

pollwrnorm

普通資料可寫是是

pollwrband

優先順序帶資料可寫是是

pollrdhup

tcp連線被對端關閉,或者關閉了寫操作,由gnu引入是是

popphup掛起否

是pollerr錯誤否

是pollnval

檔案描述符沒有開啟否是

注意:

每個結構體的 events 域是由使用者來設定,告訴核心我們關注的是什麼,而 revents 域是返回時核心設定的,以說明對該描述符發生了什麼事件

與select中socket就緒條件一致:

讀就緒:

1)socket核心中,接收緩衝區中的位元組數,大於等於低水位標記so_rcvlowat. 此時可以無阻塞的讀該檔案描述符, 並且返回值大於0;

2)socket tcp通訊中, 對端關閉連線, 此時對該socket讀, 則返回0;

3)監聽的socket上有新的連線請求;

4)socket上有未處理的錯誤;

寫就緒:

1)socket核心中, 傳送緩衝區中的可用位元組數(傳送緩衝區的空閒位置大⼩), 大於等於低水位標記 so_sndlowat, 此時可以無阻塞的寫, 並且返回值大於0;

2)socket的寫操作被關閉(close或者shutdown). 對乙個寫操作被關閉的socket進行寫操作, 會觸發 sigpipe訊號;

3)socket使⽤非阻塞connect連線成功或失敗之後;

4)socket上有未讀取的錯誤;

異常就緒:

socket上收到帶外資料.

使用poll函式監控標準輸入:用poll監控標準輸入是因為當沒有輸入的時候,程序就一直處於阻塞狀態,當有資料輸入時時間就立即就緒,如果監聽標準輸出,由於寫緩衝區比較大,可能一直處於就緒狀態,不利於觀察。

程式**:

1 #include2 #include3 #include4 

5 int main()

6 19 if(ret==0)

20

24 if(poll_fd.revents==pollin)

25

30 }

31 }

執行結果:當沒有輸入時,程序處於阻塞狀態(每兩秒輸出一條poll timeout語句):

當有輸入時,系統會告訴使用者事件就緒,進行輸入工作,即有輸入時就列印到螢幕上:

通過poll函式的結構以及小測試程式的編寫,我們不難發現poll函式的一些特點:

(1)poll() 不要求開發者計算最大檔案描述符加一的大小。

(2)poll() 在應付大數目的檔案描述符的時候速度更快,相比於select。

(3)它沒有最大連線數的限制,原因是它是基於鍊錶來儲存的。

(4)在呼叫函式時,只需要對引數進行一次設定就好了

(1)大量的fd的陣列被整體複製於使用者態和核心位址空間之間,而不管這樣的複製是不是有意義。

(2)與select一樣,poll返回後,需要輪詢pollfd來獲取就緒的描述符,這樣會使效能下降

(3)同時連線的大量客戶端在一時刻可能只有很少的就緒狀態,因此隨著監視的描述符數量的增長,其效率也會線性下降

類方法基本概念

在類方法中呼叫本類的類方法可直接呼叫。例項方法也叫做物件方法。類方法是屬於整個類的,而例項方法是屬於類的某個物件的。由於類方法是屬於整個類的,並不屬於類的哪個物件,所以類方法的方法體中不能有與類的物件有關的內容。即類方法體有如下限制 1 類方法中不能引用物件變數 2 類方法中不能呼叫類的物件方法 3...

基本概念 C 基本概念

由於工作中需要用到c 編寫的一些工具,有時候需要根據需求修改或者定製工具,所以現在不得不學習一下c 的基礎語法,此為筆記,不成章法!機器語言 組合語言 高階語言 面向過程的程式設計方法 物件導向的程式設計方法 泛型程式設計方法 1 演算法設計 2 源程式編輯 3 編譯 4 連線 5 執行除錯 輸入裝...

基本概念 數控系統基本概念

第一章 基本概念 數控工具機cnc是一種按事先編制好的加工零件程式進行加工的高效 自動化加工裝置。是 computer numerical control machine tools 的簡稱。數控工具機較好地解決了複雜 精密 小批量 多品種的零件加工問題,是一種柔性的 高效能的自動化工具機。西門子系...