ファイルモニターを構築するために、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 が実際には整数であることがわかりました。これは、ファイル オブジェクトではなくファイル記述子である必要があります。ここでどう動く!?
ありがとう!