inotify不会在close()/终止时释放手表句柄

时间:2013-02-11 13:41:28

标签: kernel inotify

我正在尝试使用inotify监视容器使用的资源,并且遇到了看起来像bug的内容。我正在使用以下代码进行测试:

#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代码中存在某种回归。

是否还有其他人遇到此问题,或者是否可以重现该问题?我没有在互联网上发现任何关于这个问题的内容,但我想不出还有什么可能导致这个问题。

0 个答案:

没有答案