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 コードに何らかの回帰があると推測できます。
他の誰かがこの問題に遭遇しましたか、それとも再現できますか? この問題についてインターネット上で何も見つけていませんが、他に何が原因である可能性があるのか 考えられません.