Linux应用程序poll机制
poll函数原型:
int poll(structpollfd *fds , unsigned int nfds , int timeout);
fds 为待查询的pollfd结构体数组指针;
nfds 为第一个参数中有多少个设备(要监控几个设备文件,就定义几个结构体);
timeout 为进程睡眠时间,为负数表示无限等待,为0表示调用后不用等待立即返回;
返回值:为0表示超时前没有任何事件发生;-1表示失败;成功则返回结构体中revents不为0的文件描述符个数(即查询到期望状态的设备文件个数)
每个要监侧的设备文件,都要定义一个pollfd结构体:
strcut pollfd
{
int fd; //查询的文件描述符
short events; //期望查询到的事件掩码
short revents; //实际发生返回的事件掩码
};
pollfd结构监控的事件类型如下:
#define POLLIN 0x0001 //有数据可读
#define POLLPRI 0x0002
#define POLLOUT 0x0004 //写数据不会导致阻塞。
#define POLLERR 0x0008
#define POLLHUP 0x0010
#define POLLNVAL 0x0020
#define POLLRDNORM 0x0040
#define POLLRDBAND 0x0080
#define POLLWRNORM 0x0100
#define POLLWRBAND 0x0200
#define POLLMSG 0x0400
#define POLLREMOVE 0x1000
#define POLLRDHUP 0x2000
如上events事件掩码的值域,POLLIN|POLLPRI类似于select的读事件,POLLOUT|POLLWRBAND类似于select的写事件。当events属性为POLLIN|POLLOUT,表示监控是否可读或可写。在poll返回时,即可通过检查revents变量对应的标志位与events是否相同,比如revents中POLLIN事件标志位被设置,则表示文件描述符可以被读取。
代码示例参考:http://blog.csdn.net/zhandoushi1982/article/details/7738424
int sockfd; //套接字句柄
struct pollfd pollfds;
int timeout;
timeout = 5000;
pollfds.fd = sockfd; //设置监控sockfd
pollfds.events = POLLIN|POLLPRI; //设置监控的事件
for(;;){
switch(poll(&pollfds,1,timeout)){ //开始监控
case -1: //函数调用出错
printf("poll error \r\n");
break;
case 0:
printf("time out \r\n");
break;
default: //得到数据返回
printf("sockfd have some event \r\n");
printf("event value is 0x%x",pollfds.revents);
break;
}
}