poll 函式提供的功能與 select 類似,不過在處理流裝置時,它能提供額外的資訊。
#include
int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);
/* 返回值:若有就緒描述符則為其數目,若超時則為 0,若出錯則為 -1 */
struct pollfd;
其中引數 fdarray 陣列中的每乙個元素都是乙個 pollfd 結構,用於指定測試某個給定描述符 fd 的條件。要測試的條件由 events 成員指定,函式在相應的 revents 成員中返回該描述符的狀態。這兩個成員中的每乙個都由指定某個特定條件的一位或多位構成。下表列出了用於指定 events 標誌以及測試 revents 標誌的一些常值。
[img]
該錶被分為三個部分:第一部分是處理輸入的四個常值,第二部分是處理輸出的三個常值,第三部分是處理錯誤的三個常值。其中第三部分的三個常值不能在 events 中設定,但是當相應條件存在時就在 revents 中返回。
poll 識別三類資料:普通、優先順序帶(priority band)和高優先順序。
就 tcp 和 udp 套接字而言,以下條件會引起 poll 返回特定的 revents。
(1)所有正規 tcp 資料和所有 udp 資料都被認為是普通資料。
(2)tcp 的帶外資料被認為是優先順序帶資料。
(3)當 tcp 連線的讀半部關閉時(譬如收到了乙個來自對端的 fin),也被認為是普通資料,隨後的讀操作將返回 0。
(4)tcp 連線存在錯誤既可以認為是普通資料,也可以認為是錯誤(pollerr)。無論哪種情況,隨後的讀操作將返回 -1,並把 errno 設定成合適的值。這可以用於處理諸如接收到 rst 或發生超時等條件。
(5)在監聽套接字上有新的的連線可用既可以認為是普通資料,也可以認為是優先順序資料。大多數實現視為普通資料。
(6)非阻塞式 connect 的完成被認為是使相應套接字可寫。
結構陣列中元素的個數是由引數 nfds 指定的。歷史上該引數被定義為無符號長整型,unix98 為該引數定義了名為 nfds_t 的新的資料型別。
timeout 引數指定 poll 返回前至多等待多長時間,它是乙個指定應等待毫秒數的正值。它的可能取值如下:
(1)inftim:表示永遠等待。posix 規範要求在標頭檔案 中定義 inftim,不過許多系統仍然把它定義在 中。
(2)0:立即返回,不阻塞程序。
(3)> 0:等待指定數目的毫秒數。
如果不關心某個特定描述符,那麼可以把與它對應的 pollfd 結構的 fd 成員設定成乙個負數。poll 函式將忽略這樣的 pollfd 結構的 events 成員,返回時將它的 revents 成員的值置為 0。
下面是使用 poll 函式實現的乙個阻塞式的 tcp 回射伺服器。它使用了乙個 pollfd 結構的陣列來維護客戶資訊,另外提供了乙個 clients 陣列來儲存連線的客戶端描述符,當其中的值為 -1 時表示所在項未使用。
#include
#include
#include
#include
#include
#include
#include
#ifndef inftim
#define inftim -1
#endif
typedef struct sockaddr sa;
#define port 49877
#define listenq 5
#define maxline 1024
int main(void)
for(i=1; i<=maxi; i++)else
}else if(n == 0)else
if(--nready <= 0) // no more readable descriptors
break;}}
}return 0;
}
這裡檢查某個現有連線的返回事件包含 pollerr 的原因在於:有些實現在乙個連線上接收到 rst 時返回的是 pollerr 事件,而其他的返回的只是 pollrdnorm 事件。不論哪一種情緒,這裡都呼叫 read。當有錯誤發生時,read 將返回這個錯誤。
IO復用之poll函式介紹
函式原型 include intpoll struct pollfd fds,nfds t nfds,int timeout 函式功能 等待乙個檔案描述符轉變為就緒狀態 引數1 第乙個引數是指向乙個結構陣列第乙個元素的指標。每個陣列元素都是乙個pollfd結構,用於指定測試某個給定描述符fd的條件。...
I O多路復用之poll
poll的優點 1 poll 不要求開發者計算最大檔案描述符加一的大小。2 poll 在應付大數目的檔案描述符的時候速度更快,相比於select。3 它沒有最大連線數的限制,原因是它是基於鍊錶來儲存的。poll的缺點 1 大量的fd的陣列被整體複製於使用者態和核心位址空間之間,而不管這樣的複製是不是...
IO多路復用之poll
poll和select區別 poll伺服器監視的檔案描述符無上限 poll將輸入 輸出引數進行分離。一 poll函式 函式格式如下所示 include int poll struct pollfd fds,unsigned int nfds,int timeout 不同與select使用三個點陣圖來...