• [阅读笔记]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/),且不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系

  • 相关阅读:
    javascript练习:87设置对象事件的方法
    javascript练习:810事件与this运算符
    SQL: case when的用法(转)
    C++ :stringstream介绍,使用方法与例子(转)
    【玩转.Net MF – 01】Flash远程读写
    【.Net Micro Framework PortingKit – 13】LCD驱动开发
    【玩转.Net MF – 03】远程文件查看器
    【玩转.Net MF – 02】让PC成为MF的鼠标键盘
    【.Net Micro Framework PortingKit – 12】SysTick驱动开发
    【.Net Micro Framework PortingKit – 11】NandFlash驱动开发
  • 原文地址:https://www.cnblogs.com/yjf512/p/2798505.html
Copyright © 2020-2023  润新知