linux檔案監視器實現基於inotify

2021-10-20 18:45:06 字數 2775 閱讀 4125

功能實現

inotify api用於檢測檔案系統變化的機制,比如新建檔案、檔案更新等等。inotify可用於檢測單個檔案,也可以檢測整個目錄。

函式inotify_init(void)

建立乙個inotify的例項,

返回inotify事件佇列的檔案描述符。

核心也提供了inotify_init1(int flags)介面函式

flag等於0的,該函式等價於inotify_init(void)函式。

inotify_add_watch(int fd, const char* pathname, uint32_t mask)

新增「watch list」,檢測列表。

fd就是inotify_init的返回值,

pathname是要檢測目錄或者檔案的路徑,

mask就是要檢測的事件型別。

返回 成功則是乙個unique的watch描述符。

inotify_rm_watch(int fd, int wd)

從watch list種移除檢測的物件。

使用流程

1、初始化

2、讀取檔案

3、判斷事件處理

事件結構體

struct inotify_event 

;

wd: 檢測的物件的watch descriptor

mask: 檢測事件的mask

cookie: 和rename事件相關

len: name欄位的長度

name: 檢測物件的name`

事件型別:

in_access file was accessed (read) ().

in_attrib metadata changed, e.g., permissions, timestamps, extended

attributes, link count (since linux 2.6.25), uid, gid, etc.().

in_close_write file opened for writing was closed ().

in_close_nowrite file not opened for writing was closed ().

in_create file/directory created in watched directory ().

in_delete file/directory deleted from watched directory ().

in_delete_self watched file/directory was itself deleted.

in_modify file was modified ().

in_move_self watched file/directory was itself moved.

in_moved_from file moved out of watched directory ().

in_moved_to file moved into watched directory ().

in_open file was opened ().

示例:

#include

#include

#include

#include

intwatch_inotify_events

(int fd)

/*因為read的返回值存在乙個或者多個inotify_event物件,需要乙個乙個取出來處理*/

while

( ret >=

(int

)sizeof

(struct inotify_event)

)else

}/*event_size就是乙個事件的真正大小*/

event_size =

sizeof

(struct inotify_event)

+ event->len;

ret -

= event_size;

event_pos +

= event_size;

}return0;

}int

main

(int argc,

char

** ar**)

/*inotify初始化*/

inotifyfd =

inotify_init()

;if( inotifyfd ==-1

)/*新增watch物件*/

ret =

inotify_add_watch

(inotifyfd, 「pic/」, in_create | in_delete)

;/*處理事件*/

watch_inotify_events

(inotifyfd)

;/*刪除inotify的watch物件*/if(

inotify_rm_watch

(inotifyfd, ret)==-

1)/*關閉inotify描述符*/

close

(inotifyfd)

;return0;

}

編譯

gcc inotify.c -o inotify

在執行程式目錄新建pic目錄

mkdir pic

後台執行程式

./inotify&

在pic目錄新建檔案

touch pic/1.txt

現象終端列印

create file: 1.txt

檔案監視器 Filemon

我們可能經常會發現一些莫名其妙的檔案,很多情況下我們不清楚這個檔案是做什麼用的,有時就會懷疑這些檔案是不是病毒,filemon可以幫助我們找到答案,可以用filemon監視某個檔案是由哪個程序生成的。filemon出自 url 這個團隊目前已經被microsoft收購。如果你在用這個軟體時,字型很小...

檔案監視器 Filemon

我們可能經常會發現一些莫名其妙的檔案,很多情況下我們不清楚這個檔案是做什麼用的,有時就會懷疑這些檔案是不是病毒,filemon可以幫助我們找到答案,可以用filemon監視某個檔案是由哪個程序生成的。filemon出自 url 這個團隊目前已經被microsoft收購。如果你在用這個軟體時,字型很小...

設計模式C 實現 監視器物件

監視器物件設計模式使併發方法的執行同步化,以確保任一時刻僅有乙個方法在物件內執行。別名執行緒安全被動物件。問題場景 應用程式包含被多個執行緒併發呼叫的物件。這些方法通常修改其物件的內部狀態。為了併發執行緒內正確執行,有必要對物件的訪問進行同步和排程。如果客戶機必須顯示的獲取和釋放底層同步機制,如訊號...