Goオープンソースプロジェクト-fsnotifyソースコードの概要

3351 ワード

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を構築し、同時に2つの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を使用してファイルシステムのアクティビティを監視する )
     
    これで終わりです.