poll函数类似与select函数,但其调用形式不同。
int poll(struct pollfd fdarray[],unsigned long nfds,int timeout);
与select不同,poll并不为每个条件构造一个描述符集,而是构造一个pollfd结构数组,每个数组元素指定一个描述符编号以及对其关心的条件。
第一个参数:
struct pollfd{
int fd;
short events;
short revents;
};
fd:所要检查的描述符,<0则表示忽略。
events:在fd描述符上所关心的事件。
revents:描述符fd上发生的事件。
events成员可以设置为下图所示值的一个或几个,通过这些值可以告诉内核我们对该描述符关心的是什么。返回时,内核设置revents成员,说明该描述符发生了什么事件。
注意poll函数没有修改events成员,而select则修改了其参数,以指示哪个描述符已准备好。
前四行测试可读性、中三行测试可写性、后三行测试异常条件(内核在函数返回时设置的)。
一个描述符被挂起POLLHUP后,则不可再写向该描述符,但仍可从中读数据。
poll函数的最后一个从参数timeout可以指定我们等待多长时间。同select有三种情况:
timeout==INFTIM 表示永久等待,INFTIM通常等于-1,当描述符已准备好或捕捉到一个信号则返回。捕捉到信号poll返回-1,errorno设置为EINTR。
timeout==0 表示不等待,测试所有描述符并立即返回,这是得到很多描述符的状态而不阻塞poll函数的轮询方法。
timeout>0 表示等待timeout毫秒,当指定的描述符以准备好或者时间超时立即返回。如果超时又没有一个描述符准备好,返回0.
与select函数一样,一个描述符的阻塞不影响poll是否阻塞。