poll函數
poll函數起源於SVR3,最初侷限於流設備。SVR4取消了這種限制,允許poll工作在任何描述字上。poll提供的功能與select類似,不過在處理流設備時,它能夠提供額外的信息。
1.#include <poll.h>
2.
3.int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);
4. 返回:就緒描述字的個數,0-超時,-1-出錯
第一個參數是指向一個結構數組第一個元素的指針。每個數組元素都是一個pollfd結構,用於指定測試某個給定描述字fd的條件。
struct pollfd{
int fd; //descriptor to check
short events; //events of interest on fd
short revents; //events that occurred on fd
};
要測試的條件由events成員指定,而返回的結果則在revents中存儲。常用條件及含意說明如下:
poll函數可用的測試值
常量 | 說明 |
POLLIN | 普通或優先級帶數據可讀 |
POLLRDNORM | 普通數據可讀 |
POLLRDBAND | 優先級帶數據可讀 |
POLLPRI | 高優先級數據可讀 |
POLLOUT | 普通數據可寫 |
POLLWRNORM | 普通數據可寫 |
POLLWRBAND | 優先級帶數據可寫 |
POLLERR | 發生錯誤 |
POLLHUP | 發生掛起 |
POLLNVAL | 描述字不是一個打開的文件 |
注意:後三個只能作爲描述字的返回結果存儲在revents中,而不能作爲測試條件用於events中。
第二個參數nfds是用來指定數組fdarray的長度。
最後一個參數timeout是指定poll函數返回前等待多長時間。它的取值如下:
timeout值 | 說明 |
INFTIM | 永遠等待 |
0 | 立即返回,不阻塞進程 |
>0 | 等待指定數目的毫秒數 |
實例代碼:
pollfd pfd;
pfd.fd = m_iSock;
pfd.events = POLLIN;
while (m_isInited)
{
if(poll(&pfd, 1, 100) > 0)
{
struct sockaddr_in addrClient;
socklen_t addrLen;
memset(m_szBuf,0,sizeof(m_szBuf));
ssize_t nMsgLen = recvfrom(m_iSock,m_szBuf,sizeof(m_szBuf),0,(struct sockaddr*)&addrClient,&addrLen);
if(nMsgLen > 0)
{
m_pReceiveFunction(this,m_szBuf,nMsgLen);
}
}
}