poll提供的功能與select類似,不過在處理流設備時,它能夠提供額外的信息。
#include <poll.h>
int poll(struct pollfd fd[], nfds_t nfds, int timeout);
參數:
1)第一個參數:一個結構數組,struct pollfd結構如下:
struct pollfd{
int fd; //文件描述符
short events; //請求的事件
short revents; //返回的事件
};
events和revents是通過對代表各種事件的標志進行邏輯或運算構建而成的。events包括要監視的事件,poll用已經發生的事件填充revents。poll函數通過在revents中設置標志肌膚POLLHUP、POLLERR和POLLNVAL來反映相關條件的存在。不需要在events中對於這些標志符相關的比特位進行設置。如果fd小於0, 則events字段被忽略,而revents被置為0.標准中沒有說明如何處理文件結束。文件結束可以通過revents的標識符POLLHUN或返回0字節的常規讀操作來傳達。即使POLLIN或POLLRDNORM指出還有數據要讀,POLLHUP也可能會被設置。因此,應該在錯誤檢驗之前處理正常的讀操作。
poll函數的事件標志符值
常量 說明
POLLIN 普通或優先級帶數據可讀
POLLRDNORM 普通數據可讀
POLLRDBAND 優先級帶數據可讀
POLLPRI 高優先級數據可讀
POLLOUT 普通數據可寫
POLLWRNORM 普通數據可寫
POLLWRBAND 優先級帶數據可寫
POLLERR 發生錯誤
POLLHUP 發生掛起
POLLNVAL 描述字不是一個打開的文件
注意:后三個只能作為描述字的返回結果存儲在revents中,而不能作為測試條件用於events中。
2)第二個參數nfds:要監視的描述符的數目。
3)最后一個參數timeout:是一個用毫秒表示的時間,是指定poll在返回前沒有接收事件時應該等待的時間。如果 它的值為-1,poll就永遠都不會超時。如果整數值為32個比特,那么最大的超時周期大約是30分鍾。
timeout值 說明
INFTIM 永遠等待
0 立即返回,不阻塞進程
>0 等待指定數目的毫秒數
(轉載自:https://blog.csdn.net/djinglan/article/details/8302938)