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

Posted

技术标签:

【中文标题】当文件被删除并再次创建时,inotify 停止监视文件【英文标题】:inotify stops monitoring file when the file is deleted and created again 【发布时间】:2011-01-12 06:08:59 【问题描述】:

我在使用 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 监控,请问这是怎么回事?谢谢。

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

mask & IN_IGNORED

将非零。 IN_IGNORED 在以下情况下设置:

“Watch 被显式删除(inotify_rm_watch(2))或自动(文件被删除,或文件系统被卸载)。”

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

【讨论】:

【参考方案3】:

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

inotify 使用唯一的文件标识符 inode,而不是文件名。事实上,整个 Linux 内核都与 inode 一起工作。文件名只是查找 inode 的一种方式。

要得到你想要的,你需要监控 /root 目录。添加文件时,它将报告创建事件。如果该文件名为“temp”,那么您可以在该文件上添加一个监视。

【讨论】:

以上是关于当文件被删除并再次创建时,inotify 停止监视文件的主要内容,如果未能解决你的问题,请参考以下文章

linux 命令汇总

Inotify:仅监视文件夹中的某些文件

对大量文件进行 inotify 和 rsync

使用 inotify 检查监视文件夹中的文件是不是被覆盖

了解从频道读取的行为

linux 监视文件系统inotify 测试