我在 Python 2.7 中使用 kqueue 来构建文件监视器。
最初,它在 flags 中不断输出 0x4000,在 data 中输出 0x1,结果是发生了错误。然后我找到了LaclefYoshi给出的一个例子,它有效!
我的代码,给出错误。
import select
from time import sleep
fd = open('test').fileno()
kq = select.kqueue()
flags = select.KQ_EV_ADD | select.KQ_EV_ENABLE | select.KQ_EV_CLEAR
fflags = select.KQ_NOTE_DELETE | select.KQ_NOTE_WRITE | select.KQ_NOTE_EXTEND \
| select.KQ_NOTE_RENAME | select.KQ_NOTE_REVOKE | select.KQ_NOTE_ATTRIB\
| select.KQ_NOTE_LINK
ev = select.kevent(fd, filter=select.KQ_FILTER_VNODE,
flags=flags, fflags=fflags)
evl = kq.control([ev], 1)
print evl
while 1:
revents = kq.control([], 1, None)
print revents
sleep(1)
他的版本,将文件对象直接交给 kevent 函数。
fd = open('test')
ev = select.kevent(fd, filter=select.KQ_FILTER_VNODE,
flags=flags, fflags=fflags)
另一个版本,在 kevent 中调用一个 fileno 方法。
fd = open('test')
ev = select.kevent(fd.fileno(), filter=select.KQ_FILTER_VNODE,
flags=flags, fflags=fflags)
但是现在我真的很困惑为什么第一个版本不起作用而第三个版本很好。这两个应该是一样的吧?
我的另一个问题是,Python 中的文件对象到底是什么?我在这里看到ident实际上是一个整数,应该是文件描述符而不是文件对象。怎么在这里工作!?
谢谢!