【发布时间】: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 文件吗?