poll()返回POLLPRI和POLLERR

我开始使用Linux和嵌入式系统(路由器硬件和openwrt)进行C编程。 我已经启用了GPIO的中断,使用民意调查工作……差不多。

我可以使用poll(),如果我按下按钮来触发中断,poll()返回值> 0.到目前为止一切都很好。 现在我尝试在几个GPIO上同时使用poll(),因此想要分析每个潜在中断源的revents。 虽然中断似乎有效,但我得到了POLLPRI&POLLERR,我不明白为什么。 将pollfd结构减少到1个条目不会改变任何东西。

char value; int fd_btn1 = open("/sys/class/gpio/gpio14/value", O_RDONLY); int fd_left = open("/sys/class/gpio/gpio12/value", O_RDONLY); int fd_right = open("/sys/class/gpio/gpio13/value", O_RDONLY); struct pollfd fds[3]; fds[0].fd = fd_btn1; fds[1].fd = fd_left; fds[2].fd = fd_right; fds[0].events = POLLPRI; fds[1].events = POLLPRI; fds[2].events = POLLPRI; read(fd_btn1, &value, 1); read(fd_left, &value, 1); read(fd_right, &value, 1); ret = poll(fds, 1, 10000); //debugging purpose printf("ret: %i - revents[0]: %i", ret, fds[0].revents); 

如果按下按钮(触发中断):ret = 1d,revents = 10d

如果没有按下任何内容,则两者都是0d

我在以下url找到了一些答案: http : //e2e.ti.com/support/dsp/davinci_digital_media_processors/f/716/t/182883

我刚碰到你正在看的POLLERR。 事实certificate这是所有sysfs文件的工作方式,并且您通过sysfs接口使用gpio。

从sysfs GPIO内核文档:如果引脚可以配置为产生中断的中断,并且它已被配置为生成中断(请参阅“edge”的说明),则可以对该文件进行poll(2)并进行轮询(2) )只要中断被触发,它就会返回。 如果使用poll(2),请设置事件POLLPRI和POLLERR。 另外,如果你看一下fs / sysfs / file.c中的内核代码,你会看到sysfs_poll返回DEFAULT_POLLMASK | POLLERR | POLLPRI。

总而言之,sysfs文件返回POLLERR似乎很奇怪,我不确定他们为什么选择这样做。