树莓派3b+使用inotify监听CPU温度文件无法检测到变更问题
问题根因
你遇到的问题是sysfs虚拟文件系统的特性导致的,和你写的C++程序逻辑无关:/sys/class/thermal/thermal_zone0/temp是sysfs下的虚拟文件,它的内容并不是预先存储在磁盘上、由后台程序定时更新的,而是内核在你每次读取该文件时,实时从硬件传感器获取数据动态生成的,整个过程没有真实的文件写入操作,自然不会触发inotify能够识别的IN_MODIFY等文件变更事件。
你测试普通文件监听正常、tail -f监听该温度文件无响应,都完全符合这个特性的表现。
解决方案
首先要明确:没有办法通过inotify实现该温度文件的变更监听,你可以根据需求选择以下方案:
- 优先选择低频率轮询:每1~2秒读取一次该温度文件即可,这个操作的CPU占用不到0.1%,对树莓派的运行完全没有影响,实现逻辑简单且稳定,是绝大多数温度监控工具的通用实现方案。
- 如果确实需要事件驱动的监听,可以配置thermal子系统的温度触发阈值(trip point),通过监听netlink的uevent事件接收温度达标通知,该方案适合需要做特定温度告警的场景,不适合全范围的实时温度变化采集,实现复杂度远高于轮询。
内容的提问来源于stack exchange,提问作者iliciousness
相关产品推荐
相关产品推荐

