显然,如果要轮询传入数据,则应使用可用数据(调用read()),否则它仍将存在,并且poll将立即返回. POLLOUT实际上不需要对称操作,但通常需要尽快调用下一个write().所以作为经验法则POLLIN – >读,POLLOUT – >写.
您还应该在再次调用poll之前重置pollfd结构.
fds[0].fd = sck;
fds[0].events = POLLIN;
fds[0].revents = 0;
ret = poll( fds, 1, 2000); //2 secs timeout
if( fds[0].revents & POLLIN && ret > 0)
{
printf("event occur\n");
}
如果你不是每次都重置它,那么之前调用的垃圾可以改变轮询行为(嗯,不是真的,这只是一个可移植性问题).
在生产代码中,您还必须检查返回值,因为轮询可能因预期事件(如信号)之外的其他原因而被中断.然后你通常想再次调用它而不是读取不可用的数据(提醒一下,轮询返回值是事件数,0超时,-1一些错误,其编号为errno).
也可能发生提供给轮询的文件描述符的错误.它们不会使轮询返回错误,但会在该文件描述符的pollfd结构的revent字段中设置POLLERR,POLLHUP或POLLNVAL.如果设置了这些事件,则调用read将返回一些您可以检查的错误代码.