• <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下獲取文件變更通知

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

            #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;?

            //?信號處理例程?
            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);?
            /*?we?will?now?be?notified?if?any?of?the?files?
            in?"."?is?modified?or?new?files?are?created?
            */
            ?
            while?(1)?{?
            //?收到信號后,就會執行信號處理例程。?
            //?而?pause()?也就結束了。?
            pause();?
            printf(
            "Got?event?on?fd=%d\n",?event_fd);?
            }
            ?
            }
            ?

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

            ?

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

            評論

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

            真不錯,
            Windows下怎么實現呢?
              回復  更多評論   

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

            ACE下可以實現Windows監視文件和目錄的變更  回復  更多評論   

            導航

            統計

            常用鏈接

            留言簿(12)

            隨筆分類

            相冊

            收藏夾

            友情鏈接

            最新隨筆

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久成人国产精品免费软件| 久久久久黑人强伦姧人妻| 亚洲日本久久久午夜精品| 久久精品国产99久久久古代| 亚洲AV日韩AV永久无码久久 | 久久噜噜电影你懂的| 色噜噜狠狠先锋影音久久| 久久福利片| 久久AV高清无码| 一本一道久久a久久精品综合| 亚洲AV无码久久精品蜜桃| 久久99精品国产99久久6| 久久人人添人人爽添人人片牛牛| 国产精品久久永久免费| 久久久久久av无码免费看大片| 国内精品久久久久久久久电影网| a级毛片无码兔费真人久久| 伊人久久精品无码av一区| 久久国产精品一区| 91精品国产综合久久婷婷| 久久久久久久精品妇女99| 色播久久人人爽人人爽人人片aV| 久久狠狠高潮亚洲精品| 久久人与动人物a级毛片| 亚洲а∨天堂久久精品| 大美女久久久久久j久久| 99久久精品毛片免费播放| 无遮挡粉嫩小泬久久久久久久| 亚洲精品无码久久久久AV麻豆| www亚洲欲色成人久久精品| 久久精品国产69国产精品亚洲| 性做久久久久久久| 久久午夜无码鲁丝片| 午夜精品久久久久久中宇| 久久久噜噜噜久久中文字幕色伊伊| 久久久久综合中文字幕| 久久久黄片| 免费久久人人爽人人爽av| 一级做a爰片久久毛片免费陪| 模特私拍国产精品久久| 久久精品成人欧美大片|