poll函數(shù)起源于SVR3,最初局限于流設(shè)備。SVR4取消了這種限制,允許poll工作在任何描述符上。poll提供的功能于select類似,不過在處理流設(shè)備時(shí),它能夠提供額外的信息。
函數(shù)原型:
#include <poll.h>
int? poll( struct? pollfd*? fdarray,? unsigned? long? nfds, int? timeout);
? ? ? ? ? ? 返回:若有就緒描述符則為其數(shù)目,若超時(shí)則為0,若出錯(cuò)則為-1
用于指定測(cè)試某個(gè)給定描述符fd的條件。
struct? pollfd {
? ? ? ? int? ? fd;? ? ? ? /* descriptor? to? check */
? ? ? ? short? events;? ? /* event of? interest? on? fd*/
? ? ? ? short? revent;? ? /* event? that occurred? on? fd */
};
要測(cè)試的條件由events成員指定,函數(shù)在相應(yīng)的revents成員中返回該描述符的狀態(tài)。(每個(gè)描述符都有兩個(gè)變量,一個(gè)為調(diào)用值,另一個(gè)為返回結(jié)果,從而避免使用值-結(jié)果參數(shù)?;叵雜elect函數(shù)中間三個(gè)參數(shù)值都是值-結(jié)果參數(shù)。)這兩個(gè)成員中的每一個(gè)都由指定某個(gè)特定條件的一位或多位構(gòu)成。下圖列車了用于指定events標(biāo)志以及測(cè)試revents標(biāo)志的一些常值。

我們將該圖分為三個(gè)部分:第一部分處理輸入的四個(gè)常值,第二部分處理輸出的三個(gè)常值,第三部分處理錯(cuò)誤的三個(gè)常值。其中第三部分的三個(gè)常值不能在events中設(shè)置,但是當(dāng)相應(yīng)條件存在時(shí)就在revents中返回。
poll識(shí)別三類數(shù)據(jù):普通(normal)、優(yōu)先級(jí)帶(priority band)和高優(yōu)先級(jí)(high? priority)。這些術(shù)語(yǔ)均出自基于流的實(shí)現(xiàn)。
就TCP和UDP套接字而言,以下條件引起poll返回特定的revent。不幸的是,POSIX在其poll的定義中留了許多空洞(也就是說有許多方法可返回相同的條件)。
1) 所有正規(guī)tcp數(shù)據(jù)和所有udp數(shù)據(jù)都被認(rèn)為是普通數(shù)據(jù)。
2) tcp的帶外數(shù)據(jù)被認(rèn)為優(yōu)先級(jí)帶數(shù)據(jù)。
3) 當(dāng)tcp連接的讀半部關(guān)閉時(shí)(譬如收到了一個(gè)來(lái)自對(duì)端的FIN),也被認(rèn)為是普通數(shù)據(jù),隨后的讀操作將返回0。
4) tcp連接存在錯(cuò)誤即可認(rèn)為是普通數(shù)據(jù),也可以認(rèn)為是錯(cuò)誤(POLLERR)。無(wú)論哪種情況,隨后的讀操作將返回-1,并把errno設(shè)置成合適的值。這可用于處理諸如接收到RST和發(fā)生超時(shí)等條件。
5) 在監(jiān)聽套接字上有新的連接可用既可認(rèn)為是普通數(shù)據(jù),也可以認(rèn)為是優(yōu)先級(jí)數(shù)據(jù)。大多數(shù)實(shí)現(xiàn)視之為普通數(shù)據(jù)。
6) 非阻塞式connect的完成被認(rèn)為是使相應(yīng)套接字可寫。
結(jié)構(gòu)數(shù)組中元素的個(gè)數(shù)是由nfds參數(shù)指定。
timeout參數(shù)指定poll函數(shù)返回前等待多長(zhǎng)時(shí)間。他是一個(gè)指定應(yīng)等待毫秒數(shù)的正值。下圖給出了他的可能取值。

INFTIM常值被定義為一個(gè)負(fù)值。如果系統(tǒng)不能提供毫秒級(jí)精度的定時(shí)器,該值就向上舍入到最接近的支持的值。
當(dāng)發(fā)生錯(cuò)誤時(shí),poll函數(shù)的返回值為-1,若定時(shí)器到時(shí)之前沒有任何描述符就緒,則返回0,否則返回就緒描述符的個(gè)數(shù),即revents成員值非0的描述符個(gè)數(shù)。
如果我們不再關(guān)心某個(gè)特定描述符,那么可以把他對(duì)應(yīng)的pollfd結(jié)構(gòu)的fd成員設(shè)置成一個(gè)負(fù)值。poll函數(shù)將忽略這樣的pollfd結(jié)構(gòu)的events成員,返回時(shí)將他的revents成員的值置為0。