2014-11-25 7 views
0

Я пытаюсь написать программу, которая будет постоянно отслеживать изменения в файле и выполнять несколько действий соответственно. Я использую inotify и выбираю в цикле для отслеживания изменений файлов неблокирующим образом. Основная структура части отслеживания файлов моей программы следующая.Мониторинг изменений файла с помощью select() в цикле

#include <cstdio> 
#include <signal.h> 
#include <limits.h> 
#include <sys/inotify.h> 
#include <fcntl.h> 
#include <iostream> 
#include <fstream> 
#include <string> 

int main(int argc, char **argv) 
{ 

    const char *filename = "input.txt"; 
    int inotfd = inotify_init(); 
    char buffer[1]; 

    int watch_desc = inotify_add_watch(inotfd, filename, IN_MODIFY); 

    size_t bufsiz = sizeof(struct inotify_event) + 1; 
    struct inotify_event* event = (struct inotify_event *) &buffer[0]; 

    fd_set rfds; 
    FD_ZERO (&rfds); 
    struct timeval timeout; 

    while(1) 
    { 
     /*select() intitialisation.*/ 
     FD_SET(inotfd,&rfds); //keyboard to be listened 
     timeout.tv_sec = 10; 
     timeout.tv_usec = 0; 

     int res=select(FD_SETSIZE,&rfds,NULL,NULL,&timeout); 

     FD_ZERO(&rfds); 

     printf("File Changed\n"); 
    } 

} 

Я проверил страницу выбора вручную и каждый раз, когда выбирает(), восстанавливает дескриптор fd_set. Тем не менее, всякий раз, когда я изменяю файл (input.txt), этот код просто петли бесконечно. Я не очень опытный, используя inotify и select, поэтому я уверен, что проблема связана с тем, как я использую inotify или select. Буду признателен за любые намеки и рекомендации.

ответ

2

вы должны прочитать содержимое буфера после выбора возврата. если select() находит данные в буфере, он возвращается. поэтому, выполните read() в этом дескрипторе файла (inotfd). read call считывает данные и возвращает количество прочитанных байтов. теперь буфер пуст, и на следующей итерации вызов select() ожидает, пока в буфере не будут доступны какие-либо данные.

while(1) { ... char pBuf[1024]; res=select(FD_SETSIZE,&rfds,NULL,NULL,&timeout); read(inotfd,&pBuf, BUF_SIZE); ... }