Go開源項目 - fsnotify源代碼淺析


fsnotify是一個文件系統監控庫, 它可以支持在如下系統上使用:

  • Windows
  • Linux
  • BSD
  • OSX

使用方法來自官方示例:

    watcher, err := fsnotify.NewWatcher()
    if err != nil {
        log.Fatal(err)
    }

    // Process events
    go func() {
        for {
            select {
            case ev := <-watcher.Event:
                log.Println("event:", ev)
            case err := <-watcher.Error:
                log.Println("error:", err)
            }
        }
    }()

    err = watcher.Watch("/tmp")
    if err != nil {
        log.Fatal(err)
    }

    /* ... do stuff ... */
    watcher.Close()

注意: 

  • 當一個文件重命名並移到了另一個目錄, 這個文件將不會繼續被監控, 除非你監控了這個文件所屬的目錄.
  • 當一個目錄被監控時,如果想監控它的子目錄需要自己添加子目錄來監控他們
  • 你需要自己來處理Error和Event channels

首先里面有幾個核心方法:   NewWatcher, Watch, WatchFlags, RemoveWatch, readEvents和purgeEvents

NewWatcher就是通過調用syscall.InotifyInit()首先建立監控初始化.

然后根據返回文件描述符構造Watcher, 同時起兩個goroutine, 分別運行readEvents和purgeEvents, readEvents負責讀取新的事件並發送到internalEvent, purgeEvents負責將internalEvent的事件轉換到Event channel供外部程序使用.

Watch方法就是通過syscall.InotifyAddWatch建立監控列表,並將路徑添加到Watcher結構的paths中.

這里有一些深入學習內部實現的文章, 看完后你會發現fsnotify其實就是在外面加了個殼而已, 結構很簡單. (Linux System Call Table for x86_64, 深入研究可以看操作系統內部實現, 這里還有一個好的Inotify Example 和 使用 inotify 監控文件系統的活動)

 

至此結束.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM