select(),poll()或epoll()?对于sysfs属性

时间:2012-09-22 07:53:08

标签: c linux embedded-linux epoll beagleboard

我正在使用gpio中断。我在“/ sys / class / gpio / gpio38 / value”中有一个文件。只要属性发生更改,我就会收到通知。那么我怎样才能在用户空间中实现这一点。由于我已经收集了信息,我可以使用select(),poll()或epoll()。那么这个应用哪个是正确的?或者请建议我,如果我可以使用/ proc / irq或其他东西。谢谢:))

2 个答案:

答案 0 :(得分:3)

我找到了一些可能有帮助的here

  

GPIO信号的路径类似于/ sys / class / gpio / gpio42 /(对于GPIO#42)   并具有以下读/写属性:

     

“value”...读为0(低)或1(高)。如果是GPIO     配置为输出,可以写入该值;     任何非零值都被视为高。

     

如果引脚可以配置为产生中断的中断     如果它已配置为生成中断(请参阅     “edge”的描述,你可以在那个文件上轮询(2)和     每当触发中断时,poll(2)将返回。如果     你使用poll(2),设置事件POLLPRI和POLLERR。如果你     使用select(2),在exceptfds中设置文件描述符。后     poll(2)返回lseek(2)到sysfs的开头     文件并读取新值或关闭文件并重新打开它     阅读价值。

虽然它说的是“gpio42”,但我猜这可能适用于你的情况。如果没有,请在我的回答中发表评论。

答案 1 :(得分:1)

您可以使用其中任何一种。这里的要点是您打开sysfs文件以获取GPIO行的值(例如/sys/class/gpio/gpio42/value,然后阻止它。

行状态的变化被指示为异常条件而不是写入(可能是直观的)。

在选择的情况下:

fd_set exceptfds;
int    res;    

FD_ZERO(&exceptfds);
FD_SET(gpioFileDesc, &exceptfds);

res = select(gpioFileDesc+1, 
             NULL,               // readfds - not needed
             NULL,               // writefds - not needed
             &exceptfds,
             NULL);              // timeout (never)

if (res > 0 && FD_ISSET(gpioFileDesc, &exceptfds))
{
     // GPIO line changed
}