【问题标题】:Listen to read only sysfs file using epoll使用 epoll 监听只读 sysfs 文件
【发布时间】:2021-05-19 06:19:08
【问题描述】:

我知道 epoll 可用于有效地从用户空间读取 GPIO 事件,并且套接字还有许多其他可能性。我想用 epoll 收听只读的 sysfs 属性。是否可以?我总是在这里得到 EPOLLERR。如果有人能解释这里的问题是什么,我将不胜感激。

mFileFd = open("/sys/devices/virtual/thermal/thermal_zone0/temp", O_RDONLY | O_NONBLOCK);
if (mFileFd < 0) {
  perror("Error opening file.");
  return -1;
}

mEpollFd = epoll_create(1);
if (mEpollFd < 0) {
  perror("Unable to create epoll");
  return mEpollFd;
}

mEpollEvent.events = EPOLLIN;
mEpollEvent.data.fd = mFileFd;

err = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mFileFd, & mEpollEvent);
if (err) {
  perror("Unable to add fd to epoll instance.");
  return err;
}

int nfds = 0;
int len = 0;
char buf[200] = {
  0
};

nfds = epoll_wait(mEpollFd, mEpollEvents, 1, -1);
if (nfds < 0) {
  perror("Epoll error 1.");
  return -1;
}
for (int i = 0; i < nfds; i++) {
  if ((mEpollEvents[i].events & EPOLLERR) ||
    (mEpollEvents[i].events & EPOLLHUP)) {
    fprintf(stderr, "Epoll error 2.\n");
    return -1;
  }

  if (mEpollEvents[i].data.fd == mFileFd) {
    len = read(mFileFd, & buf, sizeof(buf) - 1);
    if (len < 0) {
      perror("File read error.");
      return -1;
    }
    buf[len] = '\0';

    printf("Got=%s", buf);
  }

}

【问题讨论】:

  • epoll 不读取。 read() 读取。
  • 我的意思是听文件变化,很明显。
  • 那么可能是这个功能没有在驱动内部实现。在内核中找到您的热驱动程序源代码,看看它是如何实现的,以及它是否支持轮询调用。
  • @KamilCuk 嗯,这确实有很大帮助。我会这样做的。
  • @KamilCuk 似乎没有与 file_operations 相关联的 epoll。您知道如何以另一种方式收听 sysfs 文件吗?

标签: linux epoll


【解决方案1】:

我发现最近在 2020 年 5 月实施了对热敏设备的轮询:https://lwn.net/Articles/819433/

【讨论】:

    猜你喜欢
    • 2021-08-23
    • 2013-12-27
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2021-01-07
    相关资源
    最近更新 更多