函式原型
#include
intpoll
(struct pollfd *fds, nfds_t nfds,
int timeout)
;
函式功能:等待乙個檔案描述符轉變為就緒狀態
引數1:
第乙個引數是指向乙個結構陣列第乙個元素的指標。每個陣列元素都是乙個pollfd
結構,用於指定測試某個給定描述符fd的條件。
struct pollfd
;
圖6-23列出了用於指定events
標誌以及測試revents
標誌的一些常值。
poll識別三類資料:普通( normal)、優先順序帶(priority band)和高優先順序(high priority)。
這些術語均出自基於流的實現。
pollin
可被定義為pollrdnorm
和pollrdband
的邏輯或。pollin
自svr3實現就存在,早於svr4中的優先順序帶,為了向後相容,該常值繼續保留。類似地,pollout
等 同於pollwrnorm
,前者早於後者。
引數2:
監控陣列中有多少檔案描述符需要被監控
引數3:
timeout 毫秒級等待
如果系統不能提供亳秒級精度的定時器,該值就向上捨入到最接近的支援值。
返回值:
當發生錯誤時,poll
函式的返回值為-1,若定時器到時之前沒有任何描述符就緒,則返回0,否則返回就緒描述符的個數,即結構陣列的revents
成員值非0的描述符個數。
注意:如果不再監控某個檔案描述符時,可以把pollfd
中,fd設定為-1,poll
不再監控此pollfd
,下次poll
返回時,會把revents
設定為0。
在select
中會有fd_setsize
的限制,而有了poll就不再有那樣的問題了,因為分配乙個pollfd
結構的陣列並把該陣列中元素的數目通知核心成了呼叫者的責任。核心不再需要知道類似fa_set
的固定大小的資料型別。
/* server.c */
#include
#include
#include
#include
#include
#include
#include
#include
"wrap.h"
#define maxline 80
#define serv_port 6666
#define open_max 1024
intmain
(int argc,
char
*ar**)
}if(i == open_max)
perr_exit
("too many clients");
client[i]
.events = pollrdnorm;
/* 設定剛剛返回的connfd,監控讀事件 */
if(i > maxi)
maxi = i;
/* 更新client中最大元素下標 */if(
--nready <=0)
continue
;/* 沒有更多就緒事件時,繼續回到poll阻塞 */
}for
(i =
1; i <= maxi; i++
)else
}else
if(n ==0)
elseif(
--nready <=0)
break
;/* no more readable descriptors */}}
}return0;
}
上篇:io復用之select函式介紹
下篇:io復用之epoll_*函式介紹
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使用三個點陣圖來...