select(),poll()或epoll()? 为sysfs属性

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

我在这里找到了一些可能有所帮助的东西:

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

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

如果该引脚可以被配置为中断产生中断,并且被配置为产生中断(参见“边沿”的描述),则可以轮询(2)该文件,并且轮询(2)将在每次中断触发。 如果使用poll(2),请设置事件POLLPRI和POLLERR。 如果使用select(2),则将文件描述符设置为exceptfds。 poll(2)返回后,lseek(2)到sysfs文件的开头,读取新的值或关闭文件并重新打开它来读取值。

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

你可以使用其中的任何一个。 这里的意思是,你打开GPIO线路的值的sysfs文件(例如/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 }