POLL函式描述

2021-05-24 11:44:03 字數 2366 閱讀 3862

unix/linux

2007-11-21 23:20:51

閱讀300

字型大小:大

小訂閱

poll()函式:這個函式是某些unix系統提供的用於執行與select()函式同等功能的函式,下面是這個函式的宣告:

#include

int poll(struct pollfd fds, nfds_t nfds, int timeout);

引數說明:

fds:是乙個struct pollfd結構型別的陣列,用於存放需要檢測其狀態的socket描述符;每當呼叫這個函式之後,系統不會清空這個陣列,操作起來比較方便;特別是對於socket連線比較多的情況下,在一定程度上可以提高處理的效率;這一點與select()函式不同,呼叫select()函式之後,select()函式會清空它所檢測的socket描述符集合,導致每次呼叫select()之前都必須把socket描述符重新加入到待檢測的集合中;因此,select()函式適合於只檢測乙個socket描述符的情況,而poll()函式適合於大量socket描述符的情況;

nfds:nfds_t型別的引數,用於標記陣列fds中的結構體元素的總數量;

timeout:是poll函式呼叫阻塞的時間,單位:毫秒;

返回值:

>0:陣列fds中準備好讀、寫或出錯狀態的那些socket描述符的總數量;

==0:陣列fds中沒有任何socket描述符準備好讀、寫,或出錯;此時poll超時,超時時間是timeout毫秒;換句話說,如果所檢測的socket描述符上沒有任何事件發生的話,那麼poll()函式會阻塞timeout所指定的毫秒時間長度之後返回,如果timeout==0,那麼poll() 函式立即返回而不阻塞,如果timeout==inftim,那麼poll() 函式會一直阻塞下去,直到所檢測的socket描述符上的感興趣的事件發生是才返回,如果感興趣的事件永遠不發生,那麼poll()就會永遠阻塞下去;

-1:  poll函式呼叫失敗,同時會自動設定全域性變數errno;

如果待檢測的socket描述符為負值,則對這個描述符的檢測就會被忽略,也就是不會對成員變數events進行檢測,在events上註冊的事件也會被忽略,poll()函式返回的時候,會把成員變數revents設定為0,表示沒有事件發生;

另外,poll() 函式不會受到socket描述符上的o_ndelay標記和o_nonblock標記的影響和制約,也就是說,不管socket是阻塞的還是非阻塞的,poll()函式都不會收到影響;而select()函式則不同,select()函式會受到o_ndelay標記和o_nonblock標記的影響,如果socket是阻塞的socket,則呼叫select()跟不呼叫select()時的效果是一樣的,socket仍然是阻塞式tcp通訊,相反,如果socket是非阻塞的socket,那麼呼叫select()時就可以實現非阻塞式tcp通訊;

所以poll() 函式的功能和返回值的含義與 select() 函式的功能和返回值的含義是完全一樣的,兩者之間的差別就是內部實現方式不一樣,select()函式基本上可以在所有支援檔案描述符操作的系統平台上執行(如:linux 、unix 、windows、macos等),可移植性好,而poll()函式則只有個別的的作業系統提供支援(如:sunos、solaris、aix、hp提供支援,但是linux不提供支援),可移植性差;

strust pollfd結構說明:

typedef struct pollfd pollfd_t;

typedef unsigned long   nfds_t;

經常檢測的事件標記: pollin/pollrdnorm(可讀)、pollout/pollwrnorm(可寫)、pollerr(出錯)

如果是對乙個描述符上的多個事件感興趣的話,可以把這些常量標記之間進行按位或運算就可以了;

比如:對socket描述符fd上的讀、寫、異常事件感興趣,就可以這樣做:struct pollfd  fds;

fds[nindex].events=pollin | pollout | pollerr;

當 poll()函式返回時,要判斷所檢測的socket描述符上發生的事件,可以這樣做: struct pollfd  fds;

檢測可讀tcp連線請求:

if((fds[nindex].revents & pollin) == pollin)

檢測可寫:

if((fds[nindex].revents & pollout) == pollout)

檢測異常:

if((fds[nindex].revents & pollerr) == pollerr)

bzero函式 Poll 函式

使用poll函式實現i o復用.poll允許工作在任何描述符中,poll提供的功能與select函式類似。函式原型如下 include返回 若有就緒描述符則為其數目,若超時返回0,出錯返回 1 第乙個引數是指向乙個結構體陣列第乙個元素的指標。每個元素都是乙個pollfd結構,用於指定測試某個給定描述...

poll()函式詳解

poll提供的功能與select類似,不過在處理流裝置時,它能夠提供額外的資訊。include int poll struct pollfd fd,nfds t nfds,int timeout 引數 1 第乙個引數 乙個結構陣列,struct pollfd結構如下 struct pollfd ev...

poll函式詳解

select 和 poll 系統呼叫的本質一樣,poll 的機制與 select 類似,與 select 在本質上沒有多大差別,管理多個描述符也是進行輪詢,根據描述符的狀態進行處理,但是 poll 沒有最大檔案描述符數量的限制 但是數量過大後效能也是會下降 poll 和 select 同樣存在乙個缺...