我在Python 2.7中使用kqueue来构建文件监视器。
最初,它一直在标志中输出0x4000,在数据中输出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实际上是一个整数,它应该是文件描述符而不是文件对象。它是如何工作的??
谢谢!