2011-01-12 93 views
3

我使用的inotify監視本地文件,使用監控文件的inotify

inotify_add_watch(fd, "/root/temp", mask). 

當這個文件被刪除,程序將通過read(fd, buf, bufSize)功能被阻止例如「/根/溫度」。即使我創建了一個新的「/ root/temp」文件,該程序仍然被讀取功能阻止。我想知道,如果inotify可以檢測到受監控的文件已創建,並且讀取函數可以從fd中獲取某些內容,以便永遠不會阻止讀取。 這裏是我的代碼:

uint32_t mask = IN_ALL_EVENTS; 
int fd = inotify_init(); 
int wd = inotify_add_watch(fd, "/root/temp", mask); 
char *buf = new char[1000]; 
int nbytes = read(fd, buf, 500); 

我監視的所有事件。

+0

要檢測文件創建,您需要觀察包含該文件的目錄。 – chmike

回答

16

問題是read默認是阻塞操作。

如果您不希望它阻止,請在read之前使用selectpoll。例如:

struct pollfd pfd = { fd, POLLIN, 0 }; 
int ret = poll(&pfd, 1, 50); // timeout of 50ms 
if (ret < 0) { 
    fprintf(stderr, "poll failed: %s\n", strerror(errno)); 
} else if (ret == 0) { 
    // Timeout with no events, move on. 
} else { 
    // Process the new event. 
    struct inotify_event event; 
    int nbytes = read(fd, &event, sizeof(event)); 
    // Do what you need... 
} 

注意:未經測試的代碼。

+0

如果我使用select或poll,是否需要定期檢查文件,例如while(true){select(...);睡覺();}?我想要的是對文件的更改應該推給我。如果沒有發生變化,程序就像閱讀功能一樣被阻止。 – user572138

+1

@ user572138:我提供的代碼片段包括:1)等待50ms的新事件; 2)如果在此期間沒有收到任何活動,它什麼也不做; 3)如果收到新的事件,它讀取事件; - 爲了得到你描述的行爲,你只需要把它包裝成一個循環,就像你提到的那樣。 – jweyrich

+0

我可能誤解了你的第一篇文章,我知道你的意思了。我認爲這是一個很好的解決方案,謝謝。 – user572138

2

爲了看到創建的新文件,您需要觀察目錄,而不是文件。看一個文件應該看到它被刪除的時間(IN_DELETE_SELF),但是如果一個新文件被創建時使用相同的名字,則可能不會發現。

您應該可以看到IN_CREATE | IN_MOVED_TO查看新創建的文件(或從另一個地方移入的文件)。

某些編輯器和其他工具(例如rsync)可能會以不同的名稱創建文件,然後重命名它。