在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
fsnotify是一个文件系统监控库, 它可以支持在如下系统上使用:
使用方法来自官方示例: 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() 注意:
首先里面有几个核心方法: 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 监控文件系统的活动)
至此结束. |
请发表评论