2012-05-23 2 views
0

내 문제는 여러 디렉토리를보기 위해 inotify를 사용하고 read() 함수를 사용하여 변경 사항을 읽는 것이다. 필자가 지적 하듯이, read() 함수는 현재보고있는 디렉토리에 무슨 일이 생길 때까지 프로그램을 멈추기 때문에 "same time"("for"루프)에서 모든 디렉토리를 볼 수 없다.read() 블록 때문에 여러 디렉토리를 볼 수 없다.

는 "기본"코드가 간단 해집니다 : 변경된 파일의 경로를 반환 get_event

while (1){ 

    for(int i = 0; i < numberOfDirectories; i++){ 

     string fileEnd = get_event(fd[i], catalogs[i]).c_str()); 
     if(string != "") do some code; 

    } 
sleep(1); 
} 

은 inotify를, 카탈로그의 [I]는 예 [i]를 지켜 디렉토리의 이름을 포함을 전략 중.

그리고 거기 get_even의 FUNC의 일부 코드 :

#define BUFF_SIZE ((sizeof(struct inotify_event)+FILENAME_MAX)*1024) 
string get_event(int fd, string target) 
{ 
    ssize_t len;  
    char buff[BUFF_SIZE] = {0};  

    len = read (fd, buff, BUFF_SIZE); 

루프 정지 작업 "에 대한"기본이 시점에서는 뭔가 먼저 디렉토리에 일어날 때까지 기다립니다. 변경 사항을 기다리는 대신 감시 된 디렉터리에 변경 사항이 있는지 확인하고 싶습니다.

도움말 : < 당신이 LINUX/UNIX의 경우

답변

0

전화

fcntl(fd, F_SETFL, O_NONBLOCK); 

직전 읽기 (...) 함수는 블로킹 모드로 파일 설명을 강제로.

+0

fcntl (fd, F_SETFL, O_NONBLOCK); 일했습니다! 고마워요 :) – wendigu

1

, 새로운 변화에 대한 여러 파일 기술자를 모니터링하는 SELECT를 사용할 수 있습니다. 어느 것이 든 먼저 변경하면 차단 대기 시간이 깨지고 변경된 설명자의 번호가 주어지면 처리하고 다시 모니터링 할 수 있습니다.

통화의 설명자 집합 내에서 관심있는 위치에 대한 모든 설명자를 제공하는 한 변경자는 어떤 설명 자인지에 관계없이 모든 변경 사항을 포착 할 수 있습니다.

+1

'poll'은 업그레이드되지 않은 15 년 된 머신을 신경 쓰지 않는 한, select보다 훨씬 나은 API이며, 휴대 가능합니다. –