Linux 在循环中使用select()监视文件更改

Linux 在循环中使用select()监视文件更改,linux,select,inotify,file-monitoring,Linux,Select,Inotify,File Monitoring,我正在尝试编写一个程序,该程序将不断跟踪文件中的更改,并相应地执行若干操作。我使用inotify和select在循环中以非阻塞方式跟踪文件修改。我的程序的文件跟踪部分的基本结构如下 #include <cstdio> #include <signal.h> #include <limits.h> #include <sys/inotify.h> #include <fcntl.h> #include <iostream> #

我正在尝试编写一个程序,该程序将不断跟踪文件中的更改,并相应地执行若干操作。我使用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");
    } 

}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
const char*filename=“input.txt”;
int inotfd=inotify_init();
字符缓冲区[1];
int watch\u desc=inotify\u add\u watch(inotfd,文件名,IN\u MODIFY);
size_t bufsiz=sizeof(struct inotify_事件)+1;
结构inotify_事件*事件=(结构inotify_事件*)和缓冲区[0];
fd_集rfds;
FD_ZERO(和RFD);
结构timeval超时;
而(1)
{
/*选择()初始化*/
FD_SET(inotfd,&rfds);//要监听的键盘
timeout.tv_sec=10;
timeout.tv_usec=0;
int res=select(FD_SETSIZE,&rfds,NULL,NULL,&timeout);
FD_ZERO(和RFD);
printf(“文件更改\n”);
} 
}

我检查了select manual页面,并在每次select()返回时重置fd_集合描述符。然而,每当我修改文件(input.txt)时,这段代码就会无限循环。我使用inotify和select的经验不是很丰富,因此,我确信问题是否出在我使用inotify或select的方式上。如果有任何提示和建议,我将不胜感激

选择返回后,必须读取缓冲区的内容。如果select()在缓冲区中找到数据,则返回。因此,对该文件描述符(inotfd)执行read()。read调用读取数据并返回它读取的字节数。现在,缓冲区是空的,在下一次迭代中,select()调用将等待缓冲区中的任何数据

while(1)
{
// ...
char-pBuf[1024];
res=select(FD_SETSIZE,&rfds,NULL,NULL,&timeout);
读取(inotfd和pBuf、BUF_大小);
// ...
}