我正在尝试编写一个程序,该程序将不断跟踪文件中的更改并相应地执行多个操作。我正在使用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描述符。但是,每当我修改文件(input.txt)时,这段代码就会无限循环。我没有经验使用inotify和select,因此,我确定问题是否与我使用inotify或select的方式有关。我将不胜感激任何提示和建议。
答案 0 :(得分:4)
在select返回后你必须读取缓冲区的内容。如果select()在缓冲区中找到数据,则返回。所以,对该文件描述符(inotfd)执行read()。 read调用读取数据并返回它读取的字节数。现在,缓冲区为空,在下一次迭代中,select()调用将等待,直到缓冲区中有任何数据可用。
while(1)
{
...
char pBuf[1024];
res=select(FD_SETSIZE,&rfds,NULL,NULL,&timeout);
read(inotfd,&pBuf, BUF_SIZE);
...
}