2013-03-11 3 views
4

나는 inotify와 관련된 질문을 검색했는데, 이것은 다소 다릅니다 ...C에서 inotify를 사용하는 방법?

하나의 파일 (디렉토리가 아님)의 변경을 모니터링하기 위해 다음 코드를 사용합니다. 테스트에서 target 파일을 저장할 때 read()가 반환됩니다. 이는 대상 파일이 작동 함을 의미합니다. 그러나 event-> mask는 32768이며 이는 IN_MODIFY가 아니며 name은 비어 있습니다. 또 다른 문제는 지속적으로 모니터링 할 수 없다는 것입니다. 파일을 두 번째로 변경하면 응답이 없습니다. 도와 주셔서 감사합니다!

#include <sys/inotify.h> 
#include <unistd.h> 
#include <stdio.h> 

#define EVENT_SIZE (sizeof (struct inotify_event)) 
#define BUF_LEN  (16 * (EVENT_SIZE + 16)) 

int main() 
{ 
    int fd; 
    fd = inotify_init(); 
    if (fd < 0) 
     perror("inotify_init()"); 

    int wd; 
    wd = inotify_add_watch(fd, "target.txt", IN_MODIFY); 
    if (wd < 0) 
     perror("inotify_add_watch"); 

    char buf[BUF_LEN]; 
    int len; 

start: 

    len = read(fd, buf, BUF_LEN); 

    if (len > 0) 
    { 
     int i = 0; 
     while (i < len) 
     { 
      struct inotify_event *event; 
      event = (struct inotify_event *) &buf[i]; 

      printf("wd=%d mask=%x cookie=%u len=%u\n", 
       event->wd, event->mask, 
       event->cookie, event->len); 

      if (event->mask & IN_MODIFY) 
       printf("file modified %s", event->name); 

      if (event->len) 
       printf("name=%s\n", event->name); 

      i += EVENT_SIZE + event->len; 
     } 
    } 

    goto start; 

    return 0; 
} 

답변

5

0x8000IN_IGNORED에 해당합니다. 마스크에 마스크가 있으면 파일이 삭제 되었기 때문에 inotify 시계가 제거되었음을 나타냅니다. 편집자가 이전 파일을 제거하고 새 파일을 그 자리에 넣었습니다. 시계가 제거 되었기 때문에 파일을 두 번 변경해도 효과가 없습니다.

디렉터리를보고 있지 않기 때문에 이름이 반환되지 않습니다.

inotify man page.

name 필드는 감시 대상 디렉터리 내의 파일에 대해 이벤트가 반환 될 때만 나타납니다. 감시 대상 디렉토리에 상대적인 파일 경로 이름을 식별합니다.

...

IN_IGNORED는 - 시계는 (inotify_rm_watch (2)) 또는 자동으로 (파일이 삭제 또는 파일 시스템을 마운트 해제)를 명시 적으로 제거되었습니다.

+0

이있어, 감사합니다! vim과 cat을 사용하여 대상 파일을 수정하는 사이에 다른 동작을 관찰했습니다. 파일을 모니터링하기 위해 wd를 사용하여 파일 이름을 검색 할 수 있습니다. – user180574

3

이벤트 -> 마스크 32768 자세한 내용은 를 IN_IGNORED있다 0x8000을하는 것과 같습니다 "/usr/include/linux/inotify.h"

if (event->mask & IN_IGNORED) { 
     /*Remove watch*/ inotify_rm_watch(fileDescriptor,watchDescriptor) 
     /*Add watch again*/ inotify_add_watch 
    }