Linux ディレクトリ通知機能 (ディレクトリ内で発生したイベントを受け取る仕組み)

http://www.linux.or.jp/JF/JFdocs/kernel-docs-2.6/dnotify.txt.html
JFを見ていたらこんなのを見つけた。


どうやら、特定のディレクトリ以下にファイルが作られたり、削除されたら検知する仕組みらしい。
検知はシグナルを使うみたいなのでスレッド内では使いづらいかも。
スレッドを使いたい場合は先に検知を行うプロセスをfork()しておいて、それ以外のプロセスでスレッドを使用すればいいかな。
Kernel2.4の方にも同じのがあるので少なくとも2.4以降では使用できそう。
ファイラの作成とかで使用できるかも。


ちなみにディレクトリをopen()してselect()をしてみたけどダメだった。
まあ、ディレクトリにたいしてのアクセスではないから当たり前?


Kernel2.6ならばこれ以外でも方法があったような気がするけど忘れてしまった。
だれか知っていたら教えてください。


以下引用

例
--

        #define _GNU_SOURCE     /* 記号定数の定義を得るために必要 */
        #include <fcntl.h>      /* glibc 2.2 では、ここに必要な値が定義されている */
        #include <signal.h>
        #include <stdio.h>
        #include <unistd.h>

        static volatile int event_fd;

        static void handler(int sig, siginfo_t *si, void *data)
        {
                event_fd = si->si_fd;
        }

        int main(void)
        {
                struct sigaction act;
                int fd;

                act.sa_sigaction = handler;
                sigemptyset(&act.sa_mask);
                act.sa_flags = SA_SIGINFO;
                sigaction(SIGRTMIN + 1, &act, NULL);

                fd = open(".", O_RDONLY);
                fcntl(fd, F_SETSIG, SIGRTMIN + 1);
                fcntl(fd, F_NOTIFY, DN_MODIFY|DN_CREATE|DN_MULTISHOT);
                /* "." 内のファイルが修正されるか、または新しい
                  ファイルが作成されれば、通知を受け取る。      */
                while (1) {
                        pause();
                        printf("ファイル記述子 %d 上でイベントが発生しました\n", event_fd);
                }
        }