小哥整理的不錯,對一些基礎的東西總結的比較全面。
一、回顧前面的select
select優點:
目前幾乎在所有的平台上支援,其良好跨平台支援也是它的乙個優點
select缺點:
1.每次呼叫 select(),都需要把 fd 集合從使用者態拷貝到核心態,這個開銷在 fd 很多時會很大,同時每次呼叫 select() 都需要在核心遍歷傳遞進來的所有 fd,這個開銷在 fd 很多時也很大。
2.單個程序能夠監視的檔案描述符的數量存在最大限制,在 linux 上一般為 1024,可以通過修改巨集定義甚至重新編譯核心的方式提公升這一限制,但是這樣也會造成效率的降低
二、poll函式概述
select() 和 poll() 系統呼叫的本質一樣,poll() 的機制與 select() 類似,與 select() 在本質上沒有多大差別,管理多個描述符也是進行輪詢,根據描述符的狀態進行處理,但是 poll() 沒有最大檔案描述符數量的限制(但是數量過大後效能也是會下降)。poll() 和 select() 同樣存在乙個缺點就是,包含大量檔案描述符的陣列被整體複製於使用者態和核心的位址空間之間,而不論這些檔案描述符是否就緒,它的開銷隨著檔案描述符數量的增加而線性增大。
poll()函式介紹
標頭檔案:
#include
函式體:
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
功能:監視並等待多個檔案描述符的屬性變化
引數:fds:指向乙個結構體陣列的第0個元素的指標,每個陣列元素都是乙個struct pollfd結構,用於指定測試某個給定的fd的條件
struct pollfd;
fd:每乙個 pollfd 結構體指定了乙個被監視的檔案描述符,可以傳遞多個結構體,指示 poll() 監視多個檔案描述符。
events:指定監測fd的事件(輸入、輸出、錯誤),每乙個事件有多個取值,如下:
revents:revents 域是檔案描述符的操作結果事件,核心在呼叫返回時設定這個域。events 域中請求的任何事件都可能在 revents 域中返回.
注意:每個結構體的 events 域是由使用者來設定,告訴核心我們關注的是什麼,而 revents 域是返回時核心設定的,以說明對該描述符發生了什麼事件
nfds:用來指定第乙個引數陣列元素個數
timeout: 指定等待的毫秒數,無論 i/o 是否準備好,poll() 都會返回.
返回值:
成功時,poll() 返回結構體中 revents 域不為 0 的檔案描述符個數;如果在超時前沒有任何事件發生,poll()返回 0;
失敗時,poll() 返回 -1,並設定 errno 為下列值之一:
ebadf:乙個或多個結構體中指定的檔案描述符無效。
eintr:請求的事件之前產生乙個訊號,呼叫可以重新發起。
einval:nfds 引數超出 plimit_nofile 值。
enomem:可用記憶體不足,無法完成請求。
執行結果:
Linux網路程式設計 I O復用之select詳解
解決程序或執行緒阻塞到某個 i o 系統呼叫而出現的技術,使程序不阻塞於某個特定的 i o 系統調 1.當客戶處理多個描述符 通常是互動式輸入 網路套接字 時,必須使用i o復用。2.tcp伺服器既要處理監聽套接字,又要處理已連線套接字,一般要使用i o復用。3.如果乙個伺服器既要處理tcp又要處理...
Linux網路程式設計 I O復用之poll函式
目前幾乎在所有的平台上支援,其良好跨平台支援也是它的乙個優點1.每次呼叫 select 都需要把 fd 集合從使用者態拷貝到核心態,這個開銷在 fd 很多時會很大,同時每次呼叫 select 都需要在核心遍歷傳遞進來的所有 fd,這個開銷在 fd 很多時也很大。2.單個程序能夠監視的檔案描述符的數量...
Linux程式設計 IO復用之select詳解
io復用技術使得程式能夠同時監聽多個檔案描述符,這對提高程式的效能至關重要。linux下實現io復用的系統呼叫主要有select poll和epoll,本文主要介紹select,後兩個將在後續文章介紹。盡量使select講解的簡單易懂,便於自己日後複習和有需要的新手朋友。select系統呼叫的主要用...