2011-01-12 96 views
1

使用inotify時遇到一些問題。 我使用inotify來監視文件的更改。這裏是我的代碼:inotify當文件被刪除並再次創建時停止監視文件

int fd = inotify_init(); 
int wd = inotify_add_watch(fd, "/root/temp", IN_ALL_EVENTS); 
int bufSize = 1000; 
char *buf = new char[bufSize]; 
memset(buf, 0, sizeof(buf)); 
int nBytes = read(fd, buf, bufSize - 1); 
cout << nBytes << " bytes read" << endl; 
inotify_event *eventPtr = (inotify_event *)buf; 
int offset = 0; 
while (offset < nBytes) 
{ 
    cout << eventPtr->mask << endl; 
    offset += sizeof(inotify_event) + eventPtr->len; 
    eventPtr = (inotify_event *)(buf + offset); 
} 
delete []buf; 

如果我刪除「/根/ TEMP」和重新創建這樣的一個文件,這個文件進行任何更改不會被inotify的監控,任何人怎麼是這樣嗎?謝謝。

回答

6

這是因爲inotify監視底層的inode,而不是文件名。當您刪除該文件時,您當前正在觀看的inode將無效,因此您必須調用inotify_rm_watch。如果要監視具有相同名稱但不同inode的新文件,則必須通過監視其父文件夾來檢測它的創建時間。

3

每當你使用一個API,閱讀文檔

inotify使用唯一文件標識符inode而不是文件名。事實上整個Linux內核都可以與inode協同工作。文件名只是查找inode的一種手段。

爲了得到你想要的,你需要監視/根目錄。它會在添加文件時報告創建事件。如果該文件被命名爲「temp」,那麼您可以在該文件上添加監視。

4

另外兩個答案是正確的。另一個有用的觀點是,inotify會告訴你手錶何時失效。

mask & IN_IGNORED 

將爲非零。 IN_IGNORED設置爲:

「手錶已被明確刪除(inotify_rm_watch(2))或自動刪除(文件已刪除,或文件系統已卸載)」。

因此,如上所述,設置此項時,您可以重新調整文件(和/或目錄,如果該文件尚未重新創建)。