poll系統呼叫和select類似,也是在指定時間內輪詢一定數量的檔案描述符,以測試其中是否有就緒者。
poll的原型如下:
int poll(struct pollfd *fd, int nfds, int timeout)fds:是乙個pollfd結構型別的陣列,它指定所有我們感興趣的檔案描述符上發生的可讀、可寫和異常等事件。pollfd結構體定義如下
struct pollfd
;
poll的事件型別
注意:pollrdhup事件發生也會觸發pollin事件
nfds:引數指定被監聽事件集合的大小(型別為unsigned long int)。
timeout:引數指定poll的超時值,單位毫秒,當timeout為-1時,poll呼叫將永遠阻塞,知道某個事件發生;當timeout為0時,poll呼叫將立即返回。
返回值:成功返回就緒檔案描述符的個數,失敗返回-1,超時時間到達無檔案描述符就緒返回0。
1.將使用者關注的事件與核心修改的就緒事件分隔開,每次呼叫poll不需要重新設定
2.poll通過int型別記錄檔案描述符,檔案描述符的取值範圍擴大到系統最大值65535
3.使用者關注的所有檔案描述符通過fds執行的使用者陣列來記錄,介意關注的檔案描述符的個數由使用者決定,可以擴大到系統最大值。
1.返回值依舊是就緒檔案描述符的個數,仍然需要去探測陣列中檔案描述符,時間複雜度為o(n)
2.核心也是採用輪詢的方式處理
具體實現**如下:
//初始化該使用者陣列,檔案描述符置-1,事件置0
void initfds(struct pollfd *fds)
}
//將獲取到的檔案描述符,新增事件(pollin | pollrdhup)
void addfd(int fd, struct pollfd *fds)
}}
//將斷開鏈結的檔案描述符從使用者陣列刪除,事件置0
void deletefd(int fd, struct pollfd *fds)
}}
//獲取的檔案描述符是新客戶端的連線,接收(accept())新的鏈結,並將該檔案描述符存入使用者陣列中並設定事件
void getclientlink(int fd, struct pollfd *fds)
//獲取的檔案描述符是客戶端的資訊時,處理收到的資訊
void dealclientdata(int fd, struct pollfd *fds)
; int n = recv(fd, buff, 127, 0);
if(n <= 0)
printf("%s\n", buff);
send(fd, "ok", 2, 0);
}
int main()
int i = 0;
//輪詢方式去檢索符合陣列中的檔案描述符是否有對應的事件發生,對不同型別的檔案描述符進行不同處理
for(; i
else if(fds[i].revents & pollin)//若事件是讀則判斷檔案描述符是新客戶端連線還是客戶端資訊
else}}
} }}
I O 復用之 poll 函式
poll 函式提供的功能與 select 類似,不過在處理流裝置時,它能提供額外的資訊。include int poll struct pollfd fdarray,unsigned long nfds,int timeout 返回值 若有就緒描述符則為其數目,若超時則為 0,若出錯則為 1 str...
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使用三個點陣圖來...