zoukankan      html  css  js  c++  java
  • [阅读笔记]fsnotify源码阅读

    fsnotify的github地址是

    fsnotify是一个文件夹监控应用。可以使用创建一个watcher来对某个文件夹进行监控


    文件目录很简单,实际就两个程序文件,fsnotify.go 和 各平台的fsnotify_XXX.go
    后一个文件是各个不同平台的实现

    example_test.go中给的是最简单的实际应用
    先fsnotify.NewWatcher()
    再开一个goroutine监听文件夹修改的事件
    然后使用watcher.Watch()来监听一个文件夹

    fsnotify中的几个public函数Watch,WatchFlags,RemoveWatch是对Watcher的具体封装,函数名一看就明白了什么意思。
    这里的flag标志watcher要监听文件夹的哪些事件,Watch默认监听所有事件。

    String函数能用string表示出事件。这里学了一招使用events = events[1:] 来达到trim同样的目的。

    purgeEvents是将内部事件转成外部事件。这个内部事件指的是syscall包有的对事件的封装和标志位,外部事件指fsnotify对事件的再次封装

    下面就到fsnotify_linux.go看linux平台下的实现。
    FileEvent类型:
    mask,代表事件的掩码,这里的事件码对应的实际上是syscall包中constants对应的一些位置码
    cookie,每个事件会分配一个唯一的cookie,这个具体是什么也不理解
    Name,触发事件的文件名


    下面是一个watch类型
    wd,syscall中对文件监控返回的watch id
    flags,syscall中对文件的flag

    watcher结构:
    mu:互斥锁,控制并发,对watcher要进行互斥监控
    fd:watcher的文件描述符,不要把这个理解成监控的文件的文件描述符。理解成通知watch消息的文件描述符
    watches:要监控的文件夹路径和watch结构的映射
    fsnFlags:要监控的事件标志位
    paths:要监控watch id和文件夹路径的映射,上面三个其实和起来就能完成了path和watch的互相查找
    Error:如果发生错误,从这个channel将错误通知主go routine
    internalEvent:文件事件队列,内部的文件事件就放在这个队列中
    Event:已经处理的文件事件队列
    done:主goroutine监听是否已经结束的通知通道
    isClose:是否已经结束的标志位,当然只能自身的goroutine使用

    下面看NewWatcher这个函数
    这里调用了syscall的InotifyInit来进行初始化
    学了一点,当syscall出现错误的时候,可以使用os.NewSyscallError来抛出错误
    里面起了两个goroutine
    readEvents()和purgeEvents()

    purgeEvents()上面已经有了,下面是readEvents
    先从w.fd中获取出syscall.InotifyEvent,这个是syscall包的通知事件。这个事件是怎么被塞入这个fd的呢?是syscall的syscall.InotifyAddWatch之后如果文件有修改就会将event写入到这个fd中。这个fd就相当于是一个先进先出的队列了。

    读出InitofifyEvent之后就需要将它变成我们这个包中定义的fileEvent。并将这个event放入到internalEvent中去。这里只是捕获消息,并没有对消息进行过滤之类的操作。考虑是否弹出和是否返回是在purgeEvent中进行过滤。

    对readEvents读完之后其他的就很好理解了。
    addWatch就是调用了一下syscall.InotifyAddWatch
    removeWatch就是调用了一下syscall.InotifyRmWatch 

    实时了解作者更多技术文章,技术心得,请关注微信公众号“轩脉刃的刀光剑影”

    本文基于署名-非商业性使用 3.0许可协议发布,欢迎转载,演绎,但是必须保留本文的署名叶剑峰(包含链接http://www.cnblogs.com/yjf512/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

  • 相关阅读:
    数据库字段太多,批量快速建立实体类方法(适合大量字段建立实体类)
    SQL service 中的 ”输入SQL命令窗口“ 打开了 “属性界面” 回到 ”输入SQL命令窗口“
    计算机软件编程英语词汇集锦
    编程常用英语词汇
    svn上传和下载项目
    当启动tomcat时出现tomcat setting should be set in tomcat preference page
    Implicit super constructor Object() is undefined for default constructor. Must define an explicit constructor
    eclipse中选中一个单词 其他相同的也被选中 怎么设置
    Spring Boot的@SpringBootApplication无法引入的问题
    最全的SpringCloud视频教程
  • 原文地址:https://www.cnblogs.com/yjf512/p/2798505.html
Copyright © 2011-2022 走看看