当前位置:文档之家› POLL返回值详解

POLL返回值详解

POLL返回值详解
和select() 函数一样,poll() 函数也可以用于执行多路复用I/O 。

但poll() 与slect()相比,用起来更加直观容易。

使用该函数,需要包含#include <poll.h>文件,实际上最终包含的是<sys/poll.h>文件,poll.h 里的内容也就是#include <sys/poll.h> 。

函数的原型:
引用
#include <poll.h>
extern int poll (struct pollfd*__fds,nfds_t__nfds,int__timeout);
poll() 没有像select() 构建fd_set 结构体的3 个数组( 针对每个条件分别有一个数组:可读性、可写性和错误条件) ,然后检查从0 到nfds 每个文件描述符。

第一个参数pollfd 结构体定义如下:
引用
/* Data structure describing a polling request. */
struct pollfd
{
int fd; /* poll 的文件描述符. */
short int events; /* fd 上感兴趣的事件(等待的事件). */
short int revents; /* fd 上实际发生的事件. */
};
fd成员表示感兴趣的,且打开了的文件描述符;
events成员是位掩码,用于指定针对这个文件描述符感兴趣的事件;revents成员是位掩码,用于指定当poll 返回时,在该文件描述符上已经发生了哪些事情。

events 和revents 结合下列常数值(宏)指定即将唤醒的事件或调查已结束的poll() 函数被唤醒的原因,这些宏常数如下:
∙POLLIN
events 中使用该宏常数,能够在折本文件的可读情况下,结束poll() 函数。

相反,revents 上使用该宏常数,在检查poll() 函数结束后,可依此判断设备文件是否处于可读状态(即使消息长度是0)。

∙POLLPRI
在events 域中使用该宏常数,能够在设备文件的高优先级数据读取状态下,结束poll() 函数。

相反,revents 上使用该宏常数,在检查poll() 函数结束后,
可依此判断设备文件是否处于可读高优先级数据的状态(即使消息长度是0)。

该宏常数用于处理网络信息包(packet) 的数据传递。

∙POLLOUT
在events 域中使用该宏常数,能够在设备文件的写入状态下,结束poll() 函数。

相反,revents 域上使用该宏常数,在检查poll() 结束后,可依此判断设备文件是否处于可写状态。

∙POLLERR
在events 域中使用该宏常数,能够在设备文件上发生错误时,结束poll()函数。

相反,revents域上使用该宏函数,在检查poll()函数结束后,可依此判断设备文件是否出错。

∙POLLHUP
在events域中使用该宏常数,能够在设备文件中发生hungup时,结束poll() 函数。

相反,在检查poll() 结束后,可依此判断设备文件是否发生hungup 。

∙POLLNVAL
在events 域中使用该宏函数,能够在文件描述符的值无效时,结束poll() 。

相反,在revents 域上使用该宏函数时,在检查poll() 函数后,文件描述符是否有效。

可用于处理网络信息时,检查socket handler 是否已经无效。

和select 一样,最后一个参数timeout 指定poll() 将在超时前等待一个事件多长事件。

这里有3 种情况:
1) timeout 为-1
这会造成poll 永远等待。

poll() 只有在一个描述符就绪时返回,或者在调用进程捕捉到信号时返回(在这里,poll 返回-1),并且设置errno 值为EINTR 。

-1 可以用宏定义常量INFTIM来代替(在pth.h 中有定义) 。

2) timeout 等于0
在这种情况下,测试所有的描述符,并且poll() 立刻返回。

这允许在poll 中没有阻塞的情况下找出多个文件描述符的状态。

3) time > 0
这将以毫秒为单位指定timeout 的超时周期。

poll() 只有在超时到期时返回,除非一个描述符变为就绪,在这种情况下,它立刻返回。

如果超时周期到齐,poll() 返回0。

这里也可能会因为某个信号而中断该等待。

和select 一样,文件描述符是否阻塞对poll 是否阻塞没有任何影响。

相关主题