当文件被删除并再次创建时,inotify将停止监视文件

时间:2011-01-12 06:09:00

标签: c++ 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;

如果我删除“/ root / temp”并重新创建这样的文件,则inotify不会监视此文件的任何更改,这是怎么回事?感谢。

3 个答案:

答案 0 :(得分:6)

这是因为inotify 会监控基础inode ,而不是文件名。删除该文件时,您当前正在观看的inode将变为无效,因此您必须调用inotify_rm_watch。如果要监视具有相同名称但具有不同inode的新文件,则必须通过监视其父文件夹来检测何时创建该文件。

答案 1 :(得分:4)

另外两个答案是正确的。另一个有用的点是inotify告诉您手表何时失效。

mask & IN_IGNORED

将为非零。在以下时间设置IN_IGNORED

“显式删除了监视(inotify_rm_watch(2))或自动删除(文件已删除,或文件系统已卸载)。”

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

答案 2 :(得分:3)

每当您使用API​​时,阅读文档

inotify使用唯一文件标识符inode,而不是文件名。整个Linux内核实际上与inode一起使用。文件名只是查找索引节点的一种方法。

要获得您想要的内容,您需要监视/ root目录。它将在添加文件时报告创建事件。如果该文件名为“temp”,则可以在该文件上添加监视。