                     Linux ǥ쥯ȥεǽ
                     ==========================

           Stephen Rothwell <sfr@canb.auug.org.au>

           Ρ JF ץ < http://www.linux.or.jp/JF/ >
             ԡ  ɧ < takahiko@hakubi.co.jp >
              2003 ǯ 4  13 

ǥ쥯ȥεǽŪϡǥ쥯ȥ꼫Ρ⤷Ϥ
եѹäȤˡ桼ץꥱˤΤȤ
Τ뤳ȤˤޤŪʥᥫ˥ϡ桼ץꥱ
 fcntl(2) Ѥƥǥ쥯ȥФϿ򤪤ʤä
餤μΤϥʥǤʤȤΤǤ

ץꥱǤϡɤΥ٥ȤȯȤΤΤ
뤳ȤǤޤƤ륤٥ȤϼΤȤǤ

        DN_ACCESS       ǥ쥯ȥΥե뤬줿 (read)
        DN_MODIFY       ǥ쥯ȥΥե뤬ѹ줿 (write,truncate)
        DN_CREATE       ǥ쥯ȥ˥ե뤬줿
        DN_DELETE       ǥ쥯ȥ⤫ե뤬줿
        DN_RENAME       ǥ쥯ȥΥե̾ѹ줿
        DN_ATTRIB       ǥ쥯ȥΥե°ѹ줿 (chmod,chown)

̾ϡΤ뤿Ӥ˥ץꥱ¦ǺϿ򤷤ʤ
ʤޤ󡣤٥ȥޥ DN_MULTISHOT Ȥ¤Ȥ
ͿƤϡϿäʤ¤ͭΤޤޤȤʤޤ
(֥٥̵פϿ뤳ȤäȤޤ) 

ǥեȤǤϡץФ SIGIO ʥ뤬Ǥꡢ
¾ͭפʾޤ󡣤F_SETSIG fcntl(2) Ȥä
륷ʥ򥫡ͥƤСʥϥɥ siginfo
¤ΤϤޤι¤ΤΥѿǤ si_fd ˤϡ٥Ȥ
ȯǥ쥯ȥбե뵭һҤäƤޤ

ץꥱǥꥢ륿ॷʥ (SIGRTMIN + <n>) Τ줫
ĤѤ뤳Ȥ򤪴ᤷޤСΤ򥭥塼󥰤
ȤǤޤäˡDN_MULTISHOT ꤹϤ줬οǤ

θ (ǽХ :-))
------------

եФƥޥ󤫤ΥäȤϡΤ
ϤǤեμΤºݤˤϥ⡼ȥо¸ߤȤǤ
ƱͤǤϡޥư桼⡼ɤΥǡ䥫ͥ
⡼ɤ NFS Фͳơ⡼Ȥ饢äˤƱͤ
Τ뤳Ȥ̣Ƥޤ

ե륷ƥΥɤФѹǾ¤ޤ뤿ᡢϡɥ󥯤
ؤ̵뤷ƤޤǤΤǡե x ĤΥǥ쥯ȥ
(a  b) ¸ߤƤȤ"a/x" Ȥ̾ΥեФѹ
ä硢ǥ쥯ȥ "a" ΤԤäƤץФƤ
Τʤޤǥ쥯ȥ "b" ΤԤäƤץ
ФƤΤϤʤޤ

ޤե뤬 (unlink) Ƥ⡢Υե뤬Ǹ¸ߤ
 (link Ƥ) ǥ쥯ȥΤȯޤ


--

        #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, &act, NULL);

                fd = open(".", O_RDONLY);
                fcntl(fd, F_SETSIG, SIGRTMIN);
                fcntl(fd, F_NOTIFY, DN_MODIFY|DN_CREATE|DN_MULTISHOT);
                /* "." Υե뤬뤫ޤϿ
                  ե뤬СΤ롣      */
                while (1) {
                        pause();
                        printf("ե뵭һ %d ǥ٥Ȥȯޤ\n", event_fd);
                }
        }


=== ϼ (᡼) ==============================
JF ץ < http://www.linux.or.jp> 
Linux Kernel Hack Japan < http://lkh.linux.or.jp/ > 

     < hng@ps.ksky.ne.jp >
ֹ     < hanataka@abyss.rim.or.jp >
       < akira-t@mb.kcom.ne.jp >
 ɧ  < ohkubo-k@suri.co.jp >
ⶶ     < taka@valinux.co.jp >
 Ƿ    < AE5T-KSN@asahi-net.or.jp >
     < kgh12351@nifty.ne.jp >
ⶶ       < hisai@din.or.jp >
˧     < yasufumi.haga@nifty.com >
     < VEC05526@nifty.ne.jp >
 Ƿ    < dica@eurus.dti.ne.jp >

=== ʲԤˤɲ ===================================
桢ʸκǸʸ "Also, files that are unlinked, will still cause
notifications in the last directory that they were linked to." ΰ̣
Ȥʬ餺Linux Kernel Hack Japan < http://lkh.linux.or.jp/ > ᡼
󥰥ꥹȤ˼䤵ƤȤ䤬褷ޤϡ
κݤ줿ޤȤ᤿ΤǤ

ǸʸϡΤȤǤ

        --------------------------------------------------
        ץեؤ򥪡ץ塢ץ¤
        եؤƤޤäȤƤ⡢ץ
        鸫ȡץȤեؤ򥯥
        ޤǤϡեؤ¸ߤƤ褦˸롣

        ץ¤եؤȤץ
        եؤ򥯥ޤǤδ֤ˡץ
        եؤФƲ餫 DN_* ٥Ȥ
        ȯ򤪤ʤä硢Υ٥Ȥ
        Τ롣
        --------------------------------------------------

κȤ򤪤ʤСưǧ뤳ȤǤޤ

(1) 嵭Υץ DN_ACCESS ٥Ȥƻ뤹褦˽
    ѥ뤷watcher Ȥץ̾Ĥ롣

(2) ե򥪡ץ󡢥꡼ɡβΥץ
    ƥѥ뤷glancer Ȥץ̾Ĥ롣

        ---------------------------------------------------------
        #include <stdio.h>
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <fcntl.h>

        int main(int argc, char **argv)
        {
                int fd;
                char buf[BUFSIZ];


                /*
                 * ǻꤵ줿ե꡼ɥ꡼
                 * ץ󤷡ϤޤԵ롣
                 */
                if ( (fd=open(argv[1],O_RDONLY)) == -1 ) return -1;
                getchar();

                /*
                 * Ϥä顢եƤɤ߽Ф
                 *  read ˤꡢDN_ACCESS ٥Ȥȯ롣
                 * 嵭 open Ȳ read δ֤¾Υץ
                 * եƤ⡢DN_ACCESS Τ롣
                 */
                read(fd, buf, sizeof(buf));

                close(fd);
                return 0;
        }
        ---------------------------------------------------------

(3) "mkdir dir; echo xxx > dir/xxx" ǥե dir/xxx 롣
    (ñʤ "touch dir/xxx" Ǥ϶Υե뤬
     ʤΤǡglancer  read()  DN_ACCESS ٥Ȥȯʤ)

(4) dir ǥ쥯ȥ˰ưwatcher ư롣

(5) ¾Υߥʥǡ"glancer dir/xxx"  glancer ư롣glancer 
    dir/xxx 򥪡ץ塢Ԥˤʤ롣

(6) glancer Ե֤ˤޤޡ¾Υߥʥ뤫 "rm dir/xxx" 
    ¹Ԥ dir/xxx 롣塢"ls dir" Ȥȡʤ
    dir/xxx ¸ߤʤȤ狼롣

(7) Ե֤ˤʤäƤ glancer ФơϤ򤪤ʤ
    ȡglancer  dir/xxx Ƥ꡼ɤ롣Υ꡼ɤˤ
    DN_ACCESS ٥Ȥȯ롣 DN_ACCESS ϡ(4) ǵư줿
    watcher Τ롣

(8) glancer λ塢"ls dir" ȤƤ⡢dir/xxx ¸ߤʤ

