我有一个特别的问题。当我知道没有什么可读时,民意调查不断返回。
因此设置如下,我有 2 个文件描述符,它们构成fd
设置民意调查监视。一种用于引脚从高到低的变化 (GPIO)。另一个用于代理输入。代理输入出现问题。
处理的顺序是:启动main函数;然后它将进行轮询;将数据写入代理;民意调查将会中断;接受数据;通过SPI发送数据;接收从设备,通过将 GPIO 拉低,发出它想要发送 ack 的信号;poll()
感觉到这种下降并做出反应;
无穷POLLIN
s :(
如果我的轮询功能没有超时,则该程序可以完美运行。当我在民意调查中加入暂停的那一刻。民意调查不断返回。不知道我在这里做错了什么。
while(1)
{
memset((void*)fdset, 0, sizeof(fdset));
fdset[0].fd = gpio_fd;
fdset[0].events = POLLPRI; // POLLPRI - There is urgent data to read
fdset[1].fd = proxy_rx;
fdset[1].events = POLLIN; // POLLIN - There is data to read
rc = poll(fdset, nfds, 1000);//POLL_TIMEOUT);
if (rc < 0) // Error
{
printf("\npoll() failed/Interrupted!\n");
}
else if (rc == 0) // Timeout occurred
{
printf(" poll() timeout\n");
}
else
{
if (fdset[1].revents & POLLIN)
{
printf("fdset[1].revents & POLLIN\n");
if ((resultR =read(fdset[1].fd,command_buf,10))<0)
{
printf("Failed to read Data\n");
}
if (fdset[0].revents & POLLPRI)
//if( (gpio_fd != -1) && (FD_ISSET(gpio_fd, &err)))
{
lseek(fdset[0].fd, 0, SEEK_SET); // Read from the start of the file
len = read(fdset[0].fd, reader, 64);
}
}
}
}
这就是我的代码的要点。
我也使用过GDB,在调试时,我发现GPIO描述符被设置为revents = 0x10
,这意味着发生了错误并且POLLPRI
也发生了。
In 这个问题 https://stackoverflow.com/questions/3021146/poll2-doesnt-empty-the-event-queue,解决了类似的问题。但只要有时间我就会一直读书POLLIN
。有点不可思议的是这个问题only当我包括时发生timeout
,如果我替换民意调查timeout
with -1
,它工作完美。