我使用 kqueues/kevent(2) 在单独的线程中监视文件的更改。(我监控一个 Python 文件进行重新解析)
我订阅如下:
EV_SET(&file_change, pyFileP, EVFILT_VNODE,
EV_ADD | EV_CLEAR,
NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND |
NOTE_ATTRIB | NOTE_LINK | NOTE_RENAME | NOTE_REVOKE,
0, 0);
当我使用 Vim 写入文件“/tmp/somefile.py”时,我得到两个单独的 kevent: 这些事件的标志 (event.fflags) 是:
NOTE_RENAME
和
NOTE_DELETE | NOTE_LINK
我从来没有收到过“NOTE_WRITE”事件!这似乎与 Vim 写入这些文件的方式有关,因为如果我这样做了
echo "sometext" >> /tmp/somefile.py
我确实得到了:
NOTE_WRITE|NOTE_EXTEND
事件。
奇怪,嗯?我没有检查 Vim 源代码,但它必须做一些奇怪的事情,或者它只是使用以这种方式实现的用户级函数?
我真的没想到会这样。这是一个已知问题,我只需要检查所有可能的事件,还是有一个已知的接口可以真正检查文件是否已被写入?