我正在用 C 语言编写一个小 Linux 实用程序,它将监视公开基本数据(例如温度传感器)的虚拟设备。我想避免轮询文件(例如通过连续cat /sys/devices/virtual/thermal/thermal_zone0/temp),而是注册一个回调来执行该文件的更改。需求根本不是实时的。
如何避免尽可能快地连续读取该文件?
对于许多本地文件系统,您可以使用(Linux 特定的)inotify(7)工具(监视文件系统或普通文件或目录中的更改)。
\n\n但是,/proc/(请参阅proc(5))和/sys/(sysfs上的 STFW )是其中包含伪文件的特殊文件系统。AFAIK(但我可能是错的,所以请检查)inotify对它们不起作用。
在探测温度的特定情况下,我想说最简单的事情确实是重复open(2)、read(2)和close(2)该 /sys/devices/virtual/thermal/thermal_zone0/temp伪文件。您可以在某个循环中执行此操作,例如sleep(3)几秒钟,或者可能nanosleep(2)或usleep(3)十分之几秒,或者利用现有的事件循环,或者可能将循环放在其他线程中。另请参阅时间(7)
(由于物理原因,温度不会快速变化,无需每毫秒探测一次;过于频繁地读取温度将需要一些 CPU 并稍微加热计算机和热探测器!)
\n\n我倾向于认为多路复用和轮询系统调用 \xc3\xa0 la poll(2)(或几乎过时的select)不能很好地处理来自 的伪文件/sys/,但我可能是错的。
如果您正在使用某些 GUI 工具包框架,它肯定已经为您提供了一些设置定期回调的方法(例如GTK 的g_timeout_add或Qt 中的计时器)。明智地使用它们。每秒无需探测温度超过两次或四次。
\n