2011-01-12 101 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))或自动删除(文件已删除,或文件系统已卸载)”。

因此,如上所述,设置此项时,您可以重新调整文件(和/或目录,如果该文件尚未重新创建)。