2011-01-12 2 views
1

inotify를 사용할 때 몇 가지 문제가 발생합니다. inotify를 사용하여 파일의 변경 사항을 모니터링합니다. 나는 "/ 루트/온도"를 삭제하고 같은 파일을 다시 작성하는 경우,이 파일에 대한 변경 사항은 inotify를 모니터링하지 않는inotify는 파일을 삭제하고 다시 만들 때 파일 모니터링을 중지합니다.

int fd = inotify_init(); 
int wd = inotify_add_watch(fd, "/root/temp", IN_ALL_EVENTS); 
int bufSize = 1000; 
char *buf = new char[bufSize]; 
memset(buf, 0, sizeof(buf)); 
int nBytes = read(fd, buf, bufSize - 1); 
cout << nBytes << " bytes read" << endl; 
inotify_event *eventPtr = (inotify_event *)buf; 
int offset = 0; 
while (offset < nBytes) 
{ 
    cout << eventPtr->mask << endl; 
    offset += sizeof(inotify_event) + eventPtr->len; 
    eventPtr = (inotify_event *)(buf + offset); 
} 
delete []buf; 

이 얼마나 사람 : 여기 내 코드는? 감사. 당신이 API를 사용할 때마다

답변

6

inotify은 파일 이름이 아닌 inode을 모니터링하기 때문입니다. 해당 파일을 삭제하면 현재보고있는 inode가 유효하지 않으므로 inotify_rm_watch을 호출해야합니다. 같은 이름이지만 다른 inode를 가진 새 파일을 모니터링하려면 상위 폴더를 모니터링하여 파일이 생성 된시기를 감지해야합니다.

3

는이 문서와를 읽어주십시오.

inotify는 파일 이름이 아닌 고유 한 파일 식별자 아이 노드를 사용하여 작동합니다. 사실 리눅스 커널 전체는 inode와 함께 작동합니다. 파일 이름은 inode를 찾는 유일한 방법입니다.

원하는 것을 얻으려면/root 디렉토리를 모니터링해야합니다. 파일 추가시 생성 이벤트를보고합니다. 해당 파일의 이름이 "temp"이면 해당 파일에 감시 기능을 추가 할 수 있습니다.

4

다른 두 개의 대답이 정확합니다. 또 다른 유용한 점은 시계가 무효화 될 때 inotify가 알려주는 것입니다.

mask & IN_IGNORED 

은 0이 아닙니다.

"시계가 명시 적으로 삭제되거나 (inotify_rm_watch (2)) 또는 자동으로 (파일이 삭제되었거나 파일 시스템이 마운트 해제 된 경우)"로 설정된 경우 IN_IGNORED이 설정됩니다.

이렇게 설정하면 파일 (및/또는 파일이 아직 재생성되지 않은 경우 디렉토리)을 다시 볼 수 있습니다.