我正在使用Linux作为我的编程平台.我poll(2)用来知道我的设备是否触发了一个事件.
第一次打电话poll是好的; 它阻止并等待事件发生.但在第二个poll函数调用中,它将返回; 但它抓住了这个事件.以下是我的代码.
ret = poll( fds, 1, 2000); //2 secs timeout
if( fds[0].revents & POLLIN && ret > 0)
{
printf("event occur\n");
}
Run Code Online (Sandbox Code Playgroud)
看来队列/缓冲区不是空的.我只是假设.
您认为这个问题是什么?
谢谢.
kri*_*iss 11
显然,如果您轮询传入的数据,您应该使用可用的数据(调用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");
}
Run Code Online (Sandbox Code Playgroud)
如果你不是每次都重置它,前一次调用的垃圾可以改变轮询行为(嗯,不是真的,这只是一个可移植性问题).
在生产代码中,您还必须检查返回值,因为轮询可能因预期事件(如信号)之外的其他原因而被中断.然后你通常想再次调用它而不是读取不可用的数据(作为提醒,轮询返回值是事件数,0超时,-1一些错误,其编号在errno中).
也可能发生提供给轮询的文件描述符的错误.它们不会使轮询返回错误,但会在该文件描述符的pollfd结构的revent字段中设置POLLERR,POLLHUP或POLLNVAL.如果设置了这些事件,则调用read将返回一些您可以检查的错误代码.
| 归档时间: |
|
| 查看次数: |
7321 次 |
| 最近记录: |