2012-12-11 4 views
1

제목으로. 프로그램은 첫 번째 이벤트를 기다린 다음 무한 루프로 들어갑니다. 왜 한 번에 하나의 이벤트 만 처리합니까?단일 inotify 읽기가 무한 루프를 만듭니다.

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

int main (int argc, char **argv) 
{ 
    int id, wd; 
    int a; 
    struct inotify_event e; 

    id = inotify_init(); 
    wd = inotify_add_watch (id, "/home/andrea/Downloads", IN_CREATE); 
    puts ("waiting..."); 
    while (read (id, &e, sizeof (struct inotify_event))) 
     { 
      printf ("created %s\n", e.name); 
      puts ("waiting..."); 
     } 
return 0; 
} 
+0

음, 어쩌면 당연 하겠지만 내 질문은 : 왜 한 번에 하나의 이벤트 만 처리하지 않는 것입니까? –

+0

아무도 대답하지 않았습니다. 글쎄, 코드가 구조체 (가변 길이 배열이 끝에 있음)를 잘못된 방식으로 관리한다는 것을 알았습니다. –

답변

0

첫째, inotify에서보고 한 이벤트는 inotify_event 크기가 아닙니다. 추가 이름이보고되기 때문입니다. FIONREAD와 함께 ioctl을 사용하면 읽을 수있는 바이트 수를 얻을 수 있습니다.

int avail; 
ioctl(id, FIONREAD, &avail); 

두 번째로 차단 I/O를 사용했습니다. inotify를 초기화하기 위해 inotify_init1 (O_NONBLOCK)을 대신 사용한다면, read()는 데이터를 사용할 수 없다면 즉시 errno를 EAGAIN으로 설정한다. 물론, FIONREAD를 처음 사용하여 데이터를 사용할 수 있는지 여부를 확인한 경우 선택 사항입니다.

관련 문제