2011-11-28 3 views
1

kqueues/kevent (2)를 사용하여 파일의 변경 사항을 별도의 스레드에서 모니터합니다. 나는 다음과 같은 가입Mac OS X의 kqueues : 이상한 이벤트 순서

(내가 파이썬 파싱의 파일 모니터) :

I 파일 "/tmp/somefile.py"에 기록
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); 

은 빔을 사용하여, 나는 두 개의 별도 kevents를 얻을 : 이러한 이벤트의 플래그 (event.fflags)는 다음과 같습니다

NOTE_RENAME 

NOTE_DELETE | NOTE_LINK 
,536,

"NOTE_WRITE"이벤트가 발생하지 않습니다!

NOTE_WRITE|NOTE_EXTEND 

이벤트를 : 나는

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

을한다면 나는 어떻게해야합니까 이후 이, 빔이 파일을 기록하는 방법을 할 수있는 뭔가가 보인다.

이상한가? Vim 소스 코드를 검사하지는 않았지만 이상한 일을해야합니까? 아니면 단순히 그런 식으로 구현 된 사용자 수준 함수를 사용합니까?

정말 기대하지 않았습니다. 이 문제는 알려진 문제인지, 가능한 모든 이벤트를 확인하거나 파일이 작성되었는지 실제로 확인하는 알려진 인터페이스가 있습니까?

답변

1

사실 Vim은 같은 파일을 덮어 쓰지 않을 것이므로 처음에는 으로 이름을 바꾼 다음 다른 파일 (링크)을 만듭니다. 당신은 같은 것을 수행하여 다음 사항을 확인 할 수 있습니다

$ vim file -c wq 

이 파일을 열고을 기록합니다.

$ ls -i 
30621217 file 

다시 빔으로 파일을 작성하고, 아이 노드 다시 확인 : 이제 아이 노드를 확인

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

그냥 다르다을. 이는 두 번째 파일이 실제로 동일한 이름을 가진 다른 파일 (다른 inode에 링크 됨)이고 이전 파일은 연결 해제되었음을 의미합니다.

많은 편집자가이를 수행합니다. 나는 Vim이이 접근법을 취하는 이유를 정확히 알 수 없다. 안전을 위해 일 수 있습니다. 파일을 처음으로 이름을 바꾼 다음 새 파일을 쓰는 중에 잘못된 내용이있는 경우 은 여전히 ​​이전 파일을 가지고 있습니다. 파일에 을 쓰고 문제가 발생하면 (메모리가 있더라도) 부분적으로는 이됩니다. 일 수 있습니다.

+0

감사합니다. 이것은 조금 문제가 있습니다. – buddhabrot

+1

실제로. 하지만 모든 행사에 귀를 기울여야합니까? NOTE_WRITE에 등록 할 수 있습니다 | NOTE_LINK와 두 경우 모두 (셸의 echo와 같은 실제 추가 또는 새 파일) 작동해야합니다. – sidyll

+0

네, 이벤트 세트가 안전하다고 생각합니다. 도와 주셔서 감사합니다. – buddhabrot