调用kevent函数时没有错误

2024-04-20 02:29:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python2.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)

在他的版本中,将file对象直接赋给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中,file对象到底是什么?我看到这里的ident实际上是一个整数,它应该是文件描述符而不是文件对象。这是怎么回事!?你知道吗

谢谢!你知道吗


Tags: 文件test版本openselectnoteflagsev