Я отслеживаю файл на предмет изменений в отдельном потоке, используя 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);
Когда я пишу в файл "/tmp/somefile.py" с помощью Vim, я получаю два отдельных кевента:
Флаги этих событий (event.fflags):
NOTE_RENAME
и
NOTE_DELETE | NOTE_LINK
Я никогда не получаю событие NOTE_WRITE!
Похоже, это как-то связано с тем, как Vim записывает эти файлы, так как если я сделаю
echo "sometext" >> /tmp/somefile.py
Я получаю:
NOTE_WRITE|NOTE_EXTEND
событие.
Странно, а? Я не проверял исходный код Vim, но он должен делать что-то странное, или он просто использует функции уровня пользователя, которые реализованы таким образом?
Я действительно не ожидал этого. Это известная проблема, мне просто нужно проверить все возможные события, или есть известный интерфейс, который действительно проверяет, был ли файл записан?