1

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" に書き込むと、2 つの別個の kevent を取得します。これらのイベント (event.fflags) のフラグは次のとおりです。

NOTE_RENAME

NOTE_DELETE | NOTE_LINK

「NOTE_WRITE」イベントは発生しません。これは、Vim がこれらのファイルを書き込む方法と関係があるようです。

echo "sometext" >> /tmp/somefile.py

私は得る:

NOTE_WRITE|NOTE_EXTEND

イベント。

変ですよね?Vim のソース コードはチェックしていませんが、何かおかしなことをしているに違いありません。

私は本当にこれを期待していませんでした。これは既知の問題ですか、考えられるすべてのイベントを確認する必要があるだけですか、それとも、ファイルが書き込まれたかどうかを実際に確認する既知のインターフェイスはありますか?

4

1 に答える 1

1

実際に起こっていることは、Vimが同じファイルを上書きしないことです。最初に、おそらく別のファイルに名前を変更してから、別のファイル(リンク)を作成します。次のようなことで確認できます。

$ vim file -c wq

これにより、ファイルが開かれ、書き込まれます。次に、iノードを確認します。

$ ls -i
30621217 file

Vimでファイルを再度書き込み、iノードを再確認します。

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

ただ違う。つまり、2番目のファイルは実際には同じ名前の別のファイル(別のiノードにリンクされている)であり、古いファイルはリンクされていません。

多くの編集者がそうしています。なぜVimがこのアプローチを採用しているのか確認できません。 安全のためかもしれません。最初にファイルの名前を変更し、新しいファイルの書き込み中に問題が発生した場合でも、古いファイルが残っています。ファイルへの書き込みを開始して問題が発生した場合(メモリを使用している場合でも)、おそらくファイルの一部が失われます。多分

于 2011-11-28T16:45:46.617 に答える