2012-02-26 1 views
2

inotify가 작동하는 방식을 이해하고 이해하기 위해 약간의 스 니펫을 만들었습니다. 내 테스트는 매우 간단합니다 : 코드를 실행 한 다음 임의의 편집기로/home/qdii/test를 열어 수정하고 파일을 저장하십시오. 아무 반응이 없습니다. 파일을 다시 수정하고 저장하면 "받은 이벤트"가 표시됩니다. 그 순간부터 파일을 다시 수정하면 더 이상 아무것도 트리거되지 않습니다.inotify는 내가 기대할 수있는 방법을 알리지 않습니다.

나는 파일을 수정할 때마다 inotify가 "이벤트를 받았다"는 것을 기대합니다. 나는 무엇을 잘못 했는가?

#include <errno.h> 
#include <sys/inotify.h> 
#include <fcntl.h> 
#include <assert.h> 
#include <unistd.h> 
#include <iostream> 
int main() 
{ 
    const int fd = inotify_init(); 
    inotify_add_watch(fd, "/home/qdii/test", IN_MODIFY); 

    while (true) 
    { 
     const size_t buf_size = sizeof(struct inotify_event); 
     char buf[buf_size]; 

     if (read(fd, buf, buf_size) >= 0) 
      std::cout << "event received" << std::endl; 

     sleep(1); 
    } 

    return 0; 
} 

답변

2

예상대로입니다. 대부분의 편집자는 (항상) 파일을 임시로 편집하지는 않지만 일시적인 파일을 만들고 데이터를 잃지 않기 위해 저장시 링크 해제/이름 바꾸기 게임을 재생합니다.

파일 삭제 이벤트를 추적하지 않으므로 추적중인 파일이 사라진 것을 알 수 없습니다. 편집기를 저장 한 후 새로 만든 파일 (이름이 같은 파일)을 계속 추적하려면 원래 시계를 제거한 다음 다시 추가해야합니다 (디렉토리의 파일 생성시 조사 트리거를 따라 가며 수행해야 함) 당신이 일하고 있어요.)

기타 언급 : 불필요하고 역효과가있는 sleep이 있습니다. read이 차단되므로 아무 일도 일어나지 않으면 CPU를 낭비하지 않으며, 잠자기하면 이벤트가 누락 될 가능성이 높아집니다.

+0

'sleep'은'inotify_init1 (IN_NONBLOCK)'으로 불완전했던 이전의 시도에서 남은 것이지만, 당신의 설명에 감사드립니다. :) – qdii

+0

'echo a >>/home/qdii/test'를 사용해서 테스트했는데 그게 증명되었습니다. 잘 일해. 다시 너 감사드립니다. – qdii

+0

오, btw 나는 파일 수정이 아니라 파일 삭제를 지켜보고있다. 그것은 아무것도 바뀌지 않습니다. – qdii