我有一个特别的问题。当我知道没有什么可读的时候,民意调查不断返回。
所以设置如下,我有 2 个文件描述符,它们构成轮询监视的 fd 集的一部分。一种是用于引脚从高到低的变化 (GPIO)。另一个用于代理输入。代理输入出现问题。
处理顺序为:启动主函数;然后它将轮询;将数据写入代理;民意调查将中断;接受数据;通过 SPI 发送数据;通过将 GPIO 拉低来接收从设备,想要发送 ack 的信号;Poll() 感知到这种下降并做出反应;无限波林 :(
如果我在 Poll 功能上没有超时,则程序运行良好。我在投票中包含超时的那一刻。民意调查不断返回。不知道我在这里做错了什么。
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,这意味着发生了错误并且也发生了 POLPRI。
poll(2) 不会清空事件队列 在上面的链接中,类似的问题得到了解决。但是当我得到 POLLIN 时,我确实一直在阅读。令人惊讶的是,这个问题仅在我包含超时时才会出现,如果我将轮询超时替换为 -1,它会完美运行。
请帮忙。