2011-01-12 1 views
3

inotify를 나는,이 파일이 삭제되면, 프로그램이 read(fd, buf, bufSize) 기능에 의해 차단됩니다모니터링 파일

inotify_add_watch(fd, "/root/temp", mask). 

를 사용하여 예를 들어 "/ 루트/온도를"로컬 파일을 모니터링 할 수 inotify를 사용하고 있습니다. 새로운 "/ root/temp"파일을 만들더라도 프로그램은 읽기 기능으로 계속 차단됩니다. 나는 inotify가 감시 된 파일이 만들어지고 읽기 기능이 fd에서 무엇인가를 얻을 수 있기 때문에 읽기가 영원히 차단되지 않도록 탐지 할 수 있는지 궁금합니다.

uint32_t mask = IN_ALL_EVENTS; 
int fd = inotify_init(); 
int wd = inotify_add_watch(fd, "/root/temp", mask); 
char *buf = new char[1000]; 
int nbytes = read(fd, buf, 500); 

내가 모든 이벤트를 모니터링 : 다음은 내 코드입니다.

+0

파일 생성을 탐지하려면 파일이있는 디렉토리를 감시해야합니다. – chmike

답변

16

문제는 read이 기본적으로 차단 작업이라는 것입니다.

차단하지 않으려면 read 앞에 select 또는 poll을 사용하십시오.

struct pollfd pfd = { fd, POLLIN, 0 }; 
int ret = poll(&pfd, 1, 50); // timeout of 50ms 
if (ret < 0) { 
    fprintf(stderr, "poll failed: %s\n", strerror(errno)); 
} else if (ret == 0) { 
    // Timeout with no events, move on. 
} else { 
    // Process the new event. 
    struct inotify_event event; 
    int nbytes = read(fd, &event, sizeof(event)); 
    // Do what you need... 
} 

: 테스트되지 않은 코드 예를 들어.

+0

select 또는 poll을 사용하는 경우 주기적으로 파일을 확인해야합니까? 예 : (true) {select (...); 자다();}? 내가 원하는 건 파일에 대한 변경 사항이 나에게 밀려 와야한다는 것이다. 변경이 없으면 읽기 기능처럼 프로그램이 차단됩니다. – user572138

+1

@ user572138 : 내가 제공 한 스 니펫은 다음을 수행합니다. 1) 50ms 동안 새 이벤트를 기다립니다. 2)이 시간 동안 이벤트가 수신되지 않으면 아무 작업도 수행하지 않습니다. 3) 새 이벤트가 수신되면 이벤트를 읽습니다. - 당신이 묘사 한 행동을 얻으려면, 당신이 언급 한 것처럼 그것을 루프로 감쌀 필요가 있습니다. – jweyrich

+0

첫 번째 글을 오해했을 수도 있습니다. 지금 무슨 뜻인지 알고 있습니다. 나는 이것이 좋은 해결책이라고 생각한다. 고마워. – user572138

2

생성 된 새 파일을 보려면 파일이 아닌 디렉토리를 감시해야합니다. 파일을 보면 파일이 삭제 된 시점 (IN_DELETE_SELF)을 볼 수 있지만 같은 이름의 새 파일이 생성 된 경우에는 발견되지 않을 수 있습니다.

IN_CREATE | IN_MOVED_TO는 새로 생성 된 파일 (또는 다른 장소에서 파일을 가져온 파일)을 표시합니다.

일부 편집기 및 기타 도구 (예 : rsync)는 다른 이름으로 파일을 만든 다음 이름을 바꿀 수 있습니다.