embedded式Linux poll()不断返回

我有一个特殊的问题。 当我知道没有什么可读的时候,民意调查不断。

所以设置如下,我有2个文件描述符,它们构成轮询手表的fd集的一部分。 一个是针对高到低的变化(GPIO)。 另一个是代理input。 代理input出现问题。

处理的顺序是:启动主要function; 它会然后投票; 将数据写入代理; 投票将打破; 接受数据; 通过SPI发送数据; 接收从设备,通过降低GPIO低来发送要发送的信号; 民意调查()意识到这个下降和反应; 无限POLLINs 🙁

如果我没有超时的投票function,程序运作完美。 在调查中包含暂停的那一刻。 民意调查不断返回。 不知道我在这里做错了什么。

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和debugging时,我发现GPIO描述符被设置为revents = 0x10这意味着和错误发生,并POLPRI也发生。

轮询(2)不清空事件队列在上面的链接类似的东西被解决。 但是当我得到POLLIN的时候,我一直都在阅读。 这个问题有点令人惊讶,只有当我包含超时时才会出现这个问题,如果我用-1replace轮询超时,它就可以完美工作。

请帮助。

Solutions Collecting From Web of "embedded式Linux poll()不断返回"

poll失败(返回-1)时,你应该用errno做一些事情,也许通过perror ; 你的nfdspoll的第二个参数)没有设置,但是它应该是常量2。

可能GCC编译器会给出一个警告,至少在启用所有警告( -Wall )的情况下,关于nfds没有被设置。

(我猜测nfds未初始化可能是一些“随机”大的值…因此,内核可能会轮询其他“随机”文件描述符,那些在你的fdset后索引2 …)

顺便说一下,你可以把你的程序放在strace 。 而使用fdset名字有点混乱(可以参考select(2) )。