2013-05-07 3 views
0

내 프로그램에서 파일 변경을 모니터링하기 위해 inotify을 사용합니다.inotify 설명자에서 읽기가 영원히 차단됨

fd = inotify_init(); 
    wd = inotify_add_watch(fd, "./test.txt", IN_ALL_EVENTS); 
    len = read(fd, buff, BUFF_SIZE); 
    while (i < len) { 
     struct inotify_event *pevent = (struct inotify_event *) &buff[i]; 
       //process events 
     i += sizeof(struct inotify_event) + pevent->len; 
    } 

을 그러나, 나는이 모니터링되는 파일의 첫 번째 변경 (이벤트 IN_OPEN, IN_MODIFY, IN_ACESS 등)에 대한 몇 가지 이벤트를 얻었다 후, 나중에 모니터 파일의 변경 사항은 어떤을 생성 않습니다 내 코드는 다음과 같습니다 다른 이벤트 ==> 내 프로그램이 읽기 기능에서 멈추는 경우 (읽기가 차단됨)

이 오류에 대해 설명해 주시겠습니까?

답변

0

"./test.txt"에 실제로 수행되는 작업과 코드 (buff, BUFF_SIZE)에 대해 자세히 알려주십시오. 그리고 여기 당신이 확인을 위해 어떤 점은 다음과 같습니다

  • 내가 읽기를 차단하는 것보다 FD를 오히려 모니터링하는 선택/설문 조사/epoll 파일을 사용하는 것이 좋습니다 파일에서 시계를 제거 할 수 있습니다 IN_IGNORED 같은 몇 가지 특별한 이벤트가있다 그 위에.
+0

답장을 보내 주셔서 감사합니다. 그것은 나를 많이 돕는다. 나는 너에게 다른 질문을하고 싶다. Vim이나 Gedit을 사용하여 파일을 열면 왜 항상 IN_DELETE_ITSELF 이벤트가 발생합니까? – khanhhh89

+0

@ khanhhh89 "test.txt"를 편집하고 저장했다고 생각합니다. 내 vim은 7.3이고 실제로'open ("test.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664)'를 사용하고 그 내용을 쓰는 것을 발견했다. 그래서 ** IN_DELETE_ITSELF ** O_TRUNC에 의해 발생합니다 믿습니다. – xgwang

+0

@wgwang 그래서 첫 번째 이벤트를 읽은 후에 inotify_add_watch ("test.txt")를 다시 사용하면 "No such file or directory"라는 오류가 발생합니다. – khanhhh89