kqueues в Mac OS X: странный порядок событий - PullRequest
1 голос
/ 28 ноября 2011

Я отслеживаю файл на предмет изменений в отдельном потоке, используя 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, но он должен делать что-то странное, или он просто использует функции уровня пользователя, которые реализованы таким образом?

Я действительно не ожидал этого. Это известная проблема, мне просто нужно проверить все возможные события, или есть известный интерфейс, который действительно проверяет, был ли файл записан?

1 Ответ

1 голос
/ 28 ноября 2011

Что на самом деле происходит, так это то, что Vim сначала не будет перезаписывать один и тот же файл. он, вероятно, переименовывает его во что-то другое, а затем создает другой файл (ссылку). Вы можете подтвердить это, выполнив что-то вроде:

$ vim file -c wq

Это откроет файл и запишет его. Теперь проверьте индекс:

$ ls -i
30621217 file

Снова запишите файл с помощью Vim и перепроверьте inode:

$ vim file -c wq
$ ls -i
30621226 file

Это просто другое. Это означает, что второй файл на самом деле другой файл (связанный с другим инодом) с тем же именем, а старое не было связи.

Многие редакторы делают это. Я не могу подтвердить, почему именно Вим использует такой подход. Может быть для безопасности: если вы сначала переименуете файл и что-то пойдет не так во время записи нового файла у вас все еще есть старый. Если вы начнете писать поверх файла, и возникает проблема (даже с памятью), вы, вероятно, потеряете часть этого Может .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...