• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            我自閑庭信步,悠然自得,不亦樂乎.

                                                   ------ Keep life simple
            GMail/GTalk/MSN:huyi.zg@gmail.com

             

            Linux下獲取文件變更通知

            文章是在網(wǎng)上搜到的,我只是截取了其中一段。

            #define?_GNU_SOURCE?/*?needed?to?get?the?defines?*/?
            #include?
            /*?in?glibc?2.2?this?has?the?needed?
            values?defined?
            */
            ?
            #include?
            #include?
            #include?

            static?volatile?int?event_fd;?

            //?信號(hào)處理例程?
            static?void?handler(int?sig,?siginfo_t?*si,?void?*data)?
            {?
            event_fd?
            =?si->si_fd;?
            }
            ?

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

            //?登記信號(hào)處理例程?
            act.sa_sigaction?=?handler;?
            sigemptyset(
            &act.sa_mask);?
            act.sa_flags?
            =?SA_SIGINFO;?
            sigaction(SIGRTMIN,?
            &act,?NULL);?

            //?需要了解當(dāng)前目錄"."的情況?
            fd?=?open(".",?O_RDONLY);?
            fcntl(fd,?F_SETSIG,?SIGRTMIN);?
            fcntl(fd,?F_NOTIFY,?DN_MODIFY
            |DN_CREATE|DN_MULTISHOT);?
            /*?we?will?now?be?notified?if?any?of?the?files?
            in?"."?is?modified?or?new?files?are?created?
            */
            ?
            while?(1)?{?
            //?收到信號(hào)后,就會(huì)執(zhí)行信號(hào)處理例程。?
            //?而?pause()?也就結(jié)束了。?
            pause();?
            printf(
            "Got?event?on?fd=%d\n",?event_fd);?
            }
            ?
            }
            ?

            上面這一小段例程,對(duì)于熟悉 Linux 系統(tǒng)編程的讀者朋友們來說,是很容易理解的。程序首先注冊(cè)一個(gè)信號(hào)處理例程,然后通知 Kernel,我要觀察 fd 上的 DN_MODIFY 和 DN_CREATE 和 DN_MULTISHOT 事件。(關(guān)于這些事件的詳細(xì)定義,請(qǐng)讀者朋友們參閱文后所列的參考資料。) Linux Kernel 收到這個(gè)請(qǐng)求后,把相應(yīng)的 fd 的 inode 給做上記號(hào),然后 Linux Kernel 和用戶應(yīng)用程序就自顧自去處理各自的別的事情去了。等到 inode 上發(fā)生了相應(yīng)的事件,Linux Kernel 就把信號(hào)發(fā)給用戶進(jìn)程,于是開始執(zhí)行信號(hào)處理例程,用戶程序?qū)ξ募到y(tǒng)上的變化也就可以及時(shí)的做出反應(yīng)了。而在這整個(gè)過程中,系統(tǒng)以及用戶程序的正常運(yùn)行基本上未受到性能上的影響。這里還需要說明的是,dnotify 并沒有通過增加新的系統(tǒng)調(diào)用來完成它的功能,而是通過 fcntl 來完成任務(wù)的。增加一個(gè)系統(tǒng)調(diào)用,相對(duì)來說是一個(gè)很大的手術(shù),而且如果設(shè)計(jì)不當(dāng),處理得不好的話,傷疤會(huì)一直留在那里,這是 Linux Kernel 的開發(fā)者們所非常不愿意見到的事情。

            ?

            posted on 2006-04-13 13:35 HuYi 閱讀(866) 評(píng)論(2)  編輯 收藏 引用 所屬分類: UNIX/Linux

            評(píng)論

            # re: Linux下獲取文件變更通知 2006-04-13 21:19 Stone Jiang

            真不錯(cuò),
            Windows下怎么實(shí)現(xiàn)呢?
              回復(fù)  更多評(píng)論   

            # re: Linux下獲取文件變更通知 2006-04-13 21:22 Stone Jiang

            ACE下可以實(shí)現(xiàn)Windows監(jiān)視文件和目錄的變更  回復(fù)  更多評(píng)論   

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(12)

            隨筆分類

            相冊(cè)

            收藏夾

            友情鏈接

            最新隨筆

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久久精品久久久久特色影视| 久久婷婷人人澡人人爽人人爱| 国产欧美一区二区久久| 久久激情五月丁香伊人| 思思久久99热免费精品6| 漂亮人妻被黑人久久精品| 日本精品久久久中文字幕| 亚洲国产天堂久久久久久| 人妻无码αv中文字幕久久| 青青草原1769久久免费播放| 一本综合久久国产二区| 韩国无遮挡三级久久| 综合久久精品色| 国产亚洲成人久久| 久久精品无码专区免费东京热| 久久99精品久久久久久不卡| 欧美一区二区三区久久综| 日韩美女18网站久久精品| 青青草国产成人久久91网| 精品无码久久久久国产动漫3d| 久久精品一区二区影院| 久久本道伊人久久| 国产亚洲精品美女久久久| 亚洲国产日韩综合久久精品| 国产成人精品久久亚洲高清不卡 | 久久亚洲精品无码AV红樱桃| 四虎影视久久久免费| 久久精品国产只有精品66| 久久综合久久综合久久| 国产成人久久精品激情| 一本一道久久综合狠狠老| 伊人久久一区二区三区无码| 久久精品国产福利国产琪琪| 91久久精品无码一区二区毛片| 69SEX久久精品国产麻豆| 99久久精品日本一区二区免费| 久久精品国产男包| 亚洲国产美女精品久久久久∴ | 久久91精品国产91久久小草 | 久久成人永久免费播放| 亚洲国产二区三区久久|