1

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し始めます。インスタンスが適切に閉じられていません。inotify ファイル記述子は正常に削除されているため、inotify コードに何らかの回帰があると推測できます。

他の誰かがこの問題に遭遇しましたか、それとも再現できますか? この問題についてインターネット上で何も見つけていませんが、他に何が原因である可能性があるのか​​ 考えられません.

4

0 に答える 0