• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Go开源项目-fsnotify源代码浅析

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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 监控文件系统的活动)

 

至此结束.


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
深度解密Go语言之 map发布时间:2022-07-10
下一篇:
许式伟:Go 语言有机会登顶,桌面侧亟待突破发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap