ファイルの変更を常に追跡し、それに応じていくつかのアクションを実行するプログラムを作成しようとしています。ループ内で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");
}
}
select のマニュアル ページを確認し、select() が戻るたびに fd_set 記述子をリセットしました。ただし、ファイル (input.txt) を変更するたびに、このコードは無限にループします。私はinotifyとselectの使用経験があまりないので、inotifyまたはselectの使用方法に問題があるかどうかは確信しています。ヒントや推奨事項をいただければ幸いです。