閱讀筆記 fsnotify原始碼閱讀

2021-09-22 13:09:41 字數 1922 閱讀 7262

fsnotify的github位址是

fsnotify是乙個資料夾監控應用。可以使用建立乙個watcher來對某個資料夾進行監控

檔案目錄很簡單,實際就兩個程式檔案,fsnotify.go 和 各平台的fsnotify_***.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 

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...

Detours 原始碼閱讀筆記

detour庫 1.原始碼 detour庫很小,直接編譯成lib比較好,在用到的 中做靜態鏈結。detours 3.0加入的新的功能 支援x64的api hook,包括 amd64 和 ia64兩套 支援所有的windows處理器 包括arm 不再依賴detoured.dll 列舉pe匯入表,匯出表...

redis原始碼閱讀筆記

在redis中乙個資料庫結構體是這樣的 每個dict是乙個hash表 typedef struct redisdb redisdb dict欄位中存放以key值為鍵,以value指標為值的hash表項dict根據型別的不同分為如下幾種 1 字串 string 操作 set key value get...