Мониторинг изменений файла с помощью 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);
...
}