2014-11-25 57 views
0

我正在嘗試編寫一個程序,該程序將不斷跟蹤文件中的更改並相應地執行一些操作。我正在使用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的方式。我會很感激任何提示和建議。

回答

2

您必須在select返回後讀取緩衝區的內容。如果select()在緩衝區中找到數據,它將返回。所以,對該文件描述符(inotfd)執行read()。讀取調用讀取數據並返回讀取的字節數量。現在,緩衝區是空的,在下一次迭代中,select()調用將等待,直到緩衝區中有任何數據可用。

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