linux 事件队列实现,linux – poll(2)不会清空事件队列

显然,如果要轮询传入数据,则应使用可用数据(调用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将返回一些您可以检查的错误代码.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值