如何轮询/sys中的文件

2 投票
2 回答
1215 浏览
提问于 2025-04-15 23:41

我在读取一个文件时遇到了问题,这个文件在/sys/目录下,里面记录了我诺基亚N900手机环境光传感器的光强度(以勒克斯为单位)。

可以在这里查看talk.maemo.org上的讨论

我尝试使用pyinotify来监控这个文件,但我觉得这样做有点不对,因为这个文件总是显示“process_IN_OPEN”、“process_IN_ACCESS”和“process_IN_CLOSE_NOWRITE”。

我基本上想要尽快获取到变化,如果有什么变化就触发一个事件,执行一个类……

这是我尝试过的代码,虽然能运行,但结果并不是我预期的(我希望能触发process_IN_MODIFY):

#!/usr/bin/env python

import os, time, pyinotify
import pyinotify

ambient_sensor = '/sys/class/i2c-adapter/i2c-2/2-0029/lux'

wm = pyinotify.WatchManager()  # Watch Manager
mask = pyinotify.ALL_EVENTS

def action(self, the_event):
    value = open(the_event.pathname, 'r').read().strip()
    return value

class EventHandler(pyinotify.ProcessEvent):
    ...
    def process_IN_MODIFY(self, event):
     print "MODIFY event:", action(self, event)
   ...

#log.setLevel(10)
notifier = pyinotify.ThreadedNotifier(wm, EventHandler())
notifier.start()

wdd = wm.add_watch(ambient_sensor, mask)
wdd

time.sleep(5)

notifier.stop()

更新 1:

嗯,我想到的办法是这样的,但我不确定是否有特别的机制:

f = open('/sys/class/i2c-adapter/i2c-2/2-0029/lux')
while True:
    value = f.read()
    print value
    f.seek(0)

把这个放在一个独立的线程中可能可以解决问题,但有没有人有更聪明、更省CPU和更快的方法来获取最新的值呢?

2 个回答

0

嗯,我想到的办法是这样的,不过我不知道有没有什么特别的机制:

f = open('/sys/class/i2c-adapter/i2c-2/2-0029/lux')
while True:
    value = f.read()
    print value
    f.seek(0)

把这个放在一个单独的线程里,可能会有效果,但有没有人有更聪明、更省CPU、更快的方法来获取最新的值呢?

谢谢,
Bjoern

1

因为/sys/file是一个伪文件,它只是展示了操作系统内部某个瞬时值的状态,所以它不会触发修改事件。这种文件的“修改”是从系统内部发生的,不遵循普通文件系统的规则。

如果修改事件根本不会被触发,那使用像pinotify这样的工具也没什么用。更好的办法是寻找特定平台的解决方案。

关于更新1的回复:

由于N900的maemo运行环境支持GFileMonitor,你可以看看它是否能提供你想要的异步事件。

忙等待——我想你应该知道——是很浪费资源的。在手机上,这样会很耗电。你至少应该在忙循环中让程序休眠一下。

撰写回答