IO復用之poll函式介紹

2021-10-08 05:19:40 字數 2300 閱讀 6371

函式原型

#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可被定義為pollrdnormpollrdband的邏輯或。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使用三個點陣圖來...