如何轮询/sys中的文件
我在读取一个文件时遇到了问题,这个文件在/sys/目录下,里面记录了我诺基亚N900手机环境光传感器的光强度(以勒克斯为单位)。
我尝试使用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,你可以看看它是否能提供你想要的异步事件。
忙等待——我想你应该知道——是很浪费资源的。在手机上,这样会很耗电。你至少应该在忙循环中让程序休眠一下。