Kernel inotify关闭时不释放监视手柄()/终止

Kernel inotify关闭时不释放监视手柄()/终止,kernel,inotify,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) {

我试图使用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;
}  
#包括
#包括
#包括
int main(int argc,字符**argv)
{
int-fd;
int-wd;
整数误差;
fd=inotify_init();
如果(fd>=0){
printf(“inotify_init:success fd=[%d]\n”,fd);
wd=inotify\u add\u watch(fd,/tmp),在所有事件中;
如果(wd>=0){
printf(“inotify\u add\u watch:success fd=[%d]wd=[%d]\n”,fd,wd);
}
如果(inotify\u rm\u watch(fd,wd)>=0){
printf(“inotify\u rm\u watch:success fd=[%d]wd=[%d]\n”,fd,wd);
}否则{
printf(“inotify\u rm\u watch:error fd=[%d]wd=[%d]errno=[%d]\n”,fd,wd,errno);
}
错误=关闭(fd);
如果(错误){
printf(“关闭(fd)错误:%d\n”,错误);
}否则{
printf(“关闭(fd)成功fd=[%d]错误=[%d]\n”,fd,错误);
}
}否则{
printf(“inotify_init失败:%d\n”,fd);
}
返回0;
}  
这应该在
/tmp
上添加一个监视,立即删除它,然后关闭inotify实例

如果我在我的笔记本电脑上运行它(ArchLinux,使用3.7.5内核),那么一切都会按预期运行:
for I in$(seq 1200);do./a.out;完成后
将很高兴添加和删除手表,只要我愿意。同样,在使用2.6.32内核的旧Ubuntu 10.04机器上

但是,在具有3.2.0内核的Ubuntu12.04上,发出相同的命令将显示成功运行的
n
,然后立即开始失败,其中
n
等于/proc/sys/fs/inotify/max_user_实例:换句话说,实例没有正确关闭。inotify文件描述符正在成功删除,这使我假设inotify代码中存在某种回归

有没有其他人遇到过这个问题,或者能够重现这个问题?我还没有在互联网上发现任何关于这个问题的信息,但我想不出还有什么可能导致这个问题