0

ファイルモニターを構築するために、Python 2.7 で kqueue を使用していました。

最初は、フラグに 0x4000、データに 0x1 を出力し続け、エラーが発生したことが判明しました。それから、 LaclefYoshiによって与えられた 1 つの例を見つけました。

私のコード、エラーを出しています。

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)

しかし今、私は最初のバージョンがうまく動かないのに、なぜ 3 番目のバージョンがうまくいくのか本当に混乱しています。これら2つは同じものでなければなりませんよね?

私が持っている他の質問は、Python のファイル オブジェクトとは正確には何ですか? ここでは、ident が実際には整数であることがわかりました。これは、ファイル オブジェクトではなくファイル記述子である必要があります。ここでどう動く!?

ありがとう!

4

0 に答える 0