我正在尝试使用 inotify 来监视容器使用的资源,并且遇到了看起来像错误的东西。我正在使用以下代码进行测试:
#include <stdio.h>
#include <errno.h>
#include <sys/inotify.h>
int main(int argc, char ** argv)
{
int fd;
int wd;
int error;
fd = inotify_init();
if (fd >= 0) {
printf("inotify_init: success fd=[%d]\n", fd);
wd = inotify_add_watch(fd, "/tmp", IN_ALL_EVENTS);
if (wd >= 0) {
printf("inotify_add_watch: success fd=[%d] wd=[%d]\n", fd, wd);
}
if (inotify_rm_watch(fd, wd) >= 0) {
printf("inotify_rm_watch: success fd=[%d] wd=[%d]\n", fd, wd);
} else {
printf("inotify_rm_watch: error fd=[%d] wd=[%d] errno=[%d]\n", fd, wd, errno);
}
error = close(fd);
if (error) {
printf("close(fd) error: %d\n", error);
} else {
printf("close(fd) success fd=[%d] error=[%d]\n", fd, error);
}
} else {
printf("inotify_init failed: %d\n", fd);
}
return 0;
}
这应该在 上添加一个监视/tmp
,立即将其删除,然后关闭 inotify 实例。
如果我在我的笔记本电脑(Arch Linux,使用 3.7.5 内核)上运行它,那么一切都会按预期工作:for i in $(seq 1 200); do ./a.out; done
只要我愿意,我会很高兴地添加和删除手表。同样在使用 2.6.32 内核的旧 Ubuntu 10.04 机器上。
但是,在具有 3.2.0 内核的 Ubuntu 12.04 机器上,发出相同的命令将显示n
成功运行的运行,然后立即开始失败,其中n
等于 /proc/sys/fs/inotify/max_user_instances:换句话说,实例未正确关闭。inotify 文件描述符已成功删除,这使我假设 inotify 代码中存在某种回归。
有没有其他人遇到过这个问题,或者能够重现它?我没有在 Internet 上发现任何有关此问题的信息,但我想不出还有什么可能导致此问题。