Мониторинг изменений файла с помощью select() в цикле

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

#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");
    } 

}

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

1 ответ

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

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

Другие вопросы по тегам