如何在 Linux 中注册文件更改时执行的回调?

tar*_*yte 1 c linux polling

我正在用 C 语言编写一个小 Linux 实用程序,它将监视公开基本数据(例如温度传感器)的虚拟设备。我想避免轮询文件(例如通过连续cat /sys/devices/virtual/thermal/thermal_zone0/temp),而是注册一个回调来执行该文件的更改。需求根本不是实时的。

如何避免尽可能快地连续读取该文件?

Bas*_*tch 6

对于许多本地文件系统,您可以使用(Linux 特定的)inotify(7)工具(监视文件系统或普通文件或目录中的更改)。

\n\n

但是,/proc/(请参阅proc(5))和/sys/sysfs上的 STFW )是其中包含伪文件的特殊文件系统。AFAIK(但我可能是错的,所以请检查)inotify对它们不起作用。

\n\n

在探测温度的特定情况下,我想说最简单的事情确实是重复open(2)read(2)close(2)/sys/devices/virtual/thermal/thermal_zone0/temp伪文件。您可以在某个循环中执行此操作,例如sleep(3)几秒钟,或者可能nanosleep(2)usleep(3)十分之几秒,或者利用现有的事件循环,或者可能将循环放在其他线程中。另请参阅时间(7)

\n\n

(由于物理原因,温度不会快速变化,无需每毫秒探测一次;过于频繁地读取温度将需要一些 CPU 并稍微加热计算机和热探测器!)

\n\n

我倾向于认为多路复用和轮询系统调用 \xc3\xa0 la poll(2)(或几乎过时的select)不能很好地处理来自 的伪文件/sys/,但我可能是错的。

\n\n

如果您正在使用某些 GUI 工具包框架,它肯定已经为您提供了一些设置定期回调的方法(例如GTK 的g_timeout_add或Qt 中的计时器)。明智地使用它们。每秒无需探测温度超过两次或四次。

\n