epoll監聽檔案 Go 檔案監控怎麼實現

2021-10-16 23:36:15 字數 2040 閱讀 3276

檔案監控linux下inotify特性:

inotify是核心乙個特性, 可以用來監控目錄, 檔案的讀寫等事件. 當監控目標是目錄時, inotify除了會監控目錄本身, 還會監控目錄中的檔案. inotify 的監控功能由如下幾個系統呼叫組成: inotify_init1, inotify_add_watch, inotify_rm_watch,read 和 close.

inotify的主要操作基於inotify_init1返回的 inotify 檔案描述符, 該描述符的作用類似於 epoll 的 epoll_fd. inotify在監控目錄的時候, 不支援對目錄的地櫃監控, 即只能監控一層目錄, 如果需要地櫃監控, 就需要將這些目錄通過 inotify_add_watch 新增進來.

fsnotify 的工作原理如下:

1. 建立 inotify 檔案描述符.(即 sys_inotify_init1 系統呼叫)

2. 建立 pipe 管道. (非阻塞, 主要的作用是喚醒 goroutine 的作用)

3. 建立 epoll 檔案描述符, 通過 epoll 進行事件監聽.

4. 將 inotify_fd, pipe_fd 的 epollin 事件新增到 epoll 當中. (sys_epoll_ctl), 也就說當 inotify_fd 或 pipe_fd

有事件就緒(epollin, epollhup, epollerr)之後可以從 epoll 當中獲取就緒的事件(sys_epoll_wait)

5. 將檔案/目錄新增到 inotify_fd 監控當中 (sys_inotify_add_watch). 主要監控的事件有: in_moved_to, in_create,

in_moved_from, in_attrib, in_modify, in_move_self, in_move_self, in_delete_self.

in_moved_to, in_create 是新增檔案

in_delete_self, in_modify 是刪除檔案

in_modify 是修改檔案

in_move_self, in_moved_from 是檔案重新命名

in_attrib 是檔案許可權

6. 開啟乙個 goroutine, 不斷從 epoll 當中讀取就緒的事件(sys_epoll_wait), 當檔案有變化時, 從 inotify_fd 當中讀取

事件內容 inotifyevent, 裡面包含了事件, 檔案描述符fd, 變更檔案的臨時名稱. 儲存格式如下:

inotifyevent: (頭部)

wd int32

mask uint32

cookie uint32

len uint32

data: 長度是 len

注意: 一次性可能存在多個事件發生.

上面所講的內容就是檔案監控的核心, 利用了 linux 的 inotify 系統呼叫來監控通知檔案的變更.

接下來的內容主要是從**的層面來說說檔案監控是怎樣實現的.

建立 inotify 監聽

// 建立乙個監聽物件

func newwatcher() (*watcher, error) ), // 結束的標記

doneresp: make(chan struct{}), // 結束喚醒的標記

go w.readevents()

return w, nil

// 建立 epoll, 並新增監聽事件

func newfdpoller(fd int) (*fdpoller, error) else if n < 0 else

w.paths[wd] = name // 註冊

} else {

watchentry.wd = uint32(wd)

watchentry.flags = flags

return nil

總結:檔案監控的核心是利用了 inotify 系統呼叫, 監聽檔案的變化, 然後通知到應用層面.

為了避免每次通知之後又需要再次進行系統呼叫所帶來的記憶體拷貝問題, 又使用了epoll 來監聽 inotify 是事件, 在事件可讀的時候, 再次通知使用者. 從而提高效率.

epoll監聽檔案 epoll的使用

epoll i o event notification facility 在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。相比於select,epoll最大的好處在於它不會隨著監聽fd數目的增長而降低效率。因為...

epoll監聽檔案 Epoll的簡介及原理

epoll 全稱 eventpoll,是 linux 核心實現io多路復用 io multiplexing 的乙個實現。io多路復用的意思是在乙個操作裡同時監聽多個輸入輸出源,在其中乙個或多個輸入輸出源可用的時候返回,然後對其的進行讀寫操作。在 linux 中,和 epoll 類似的有 select...

php監聽檔案路徑 PHP監控伺服器檔案目錄

目錄監控 author 郭瑞超 grc1988 gmail.com date 2009 04 15 license bsd package common version 0.0.1 set time limit 0 define m path 設定監控的目錄,當前目錄為 上一級目錄為 也可以設定絕對...