Linux inotify Epoll實現機制

2021-08-14 04:53:26 字數 3573 閱讀 1635

首先學習inotify機制,就是linux系統下對檔案目錄的監聽,如果目錄下有檔案建立刪除都可以被監聽到,那這個有什麼作用呢?

在android input系統中可以實現對裝置熱插拔的監聽。我們先看乙個簡單的demo

#include#include#include#include#include#include#include#include#include#include#define buf_len 1000  

void displayevent(struct inotify_event* tempevent)

int main(int argc , char** argv)

//建立inotify

mnotifyid = inotify_init();

if(mnotifyid == -1)

//新增對檔案的監聽

mwd = inotify_add_watch(mnotifyid,argv[1],in_all_events);

if(mwd == -1)

while(1)

for(p = minfobuf;p < minfobuf + mnumread;)

}return 0;

}

inotify可以監聽到哪些事件呢

可以被監控的事件:

有幾種事件能夠被監控。一些事件,比如 in_delete_self 只適用於正在被監控的專案,而另一些,比如 in_attrib 或者 in_open 則只適用於監控過的專案,或者如果該專案是目錄,則可以應用到其所包含的目錄或檔案。

in_access

被監控專案或者被監控目錄中的條目被訪問過。例如,乙個開啟的檔案被讀取。

in_modify

被監控專案或者被監控目錄中的條目被修改過。例如,乙個開啟的檔案被修改。

in_attrib

被監控專案或者被監控目錄中條目的元資料被修改過。例如,時間戳或者許可被修改。

in_close_write

乙個開啟的,等待寫入的檔案或目錄被關閉。

in_close_nowrite

乙個以唯讀方式開啟的檔案或目錄被關閉。

in_close

乙個掩碼,可以很便捷地對前面提到的兩個關閉事件(in_close_write | in_close_nowrite)進行邏輯操作。

in_open

檔案或目錄被開啟。

in_moved_from

被監控專案或者被監控目錄中的條目被移出監控區域。該事件還包含乙個 cookie 來實現 in_moved_from 與 in_moved_to 的關聯。

in_moved_to

檔案或目錄被移入監控區域。該事件包含乙個針對 in_moved_from 的 cookie。如果檔案或目錄只是被重新命名,將能看到這兩個事件,如果它只是被移入或移出非監控區域,將只能看到乙個事件。如果移動或重新命名乙個被監控專案,監控將繼續進行。參見下面的 in_move-self。

in_move

可以很便捷地對前面提到的兩個移動事件(in_moved_from | in_moved_to)進行邏輯操作的掩碼。

in_create

在被監控目錄中建立了子目錄或檔案。

in_delete

被監控目錄中有子目錄或檔案被刪除。

in_delete_self

被監控專案本身被刪除。監控終止,並且將收到乙個 in_ignored 事件。

in_move_self

監控專案本身被移動。

除了事件標誌以外,還可以在 inotify 標頭檔案(/usr/include/sys/inotify.h)中找到其他幾個標誌。例如,如果只想監控第乙個事件,可以在增加監控時設定 in_oneshot 標誌。

下面就是epoll+inotify的實現

#include #include #include #include #include #include #include #include #include /* 定義epoll最大監聽的檔案數量 */  

#define epoll_max_events 32

#define buffer_size 1024

#define array_length 128 // 定義陣列的長度

#define name_length 128 // 定義檔名長度的限制

struct file_name_fd_desc ;

static struct epoll_event gepolleventarray[epoll_max_events];

/* 定義乙個陣列用來存放對應檔案的檔案描述符和檔名 */

static struct file_name_fd_desc gfilefdarray[array_length];

static int array_index = 0;

static char *base_dir;

/*新增檔案描述符到epoll*/

static int add_to_epoll(int epoll_fd, int file_fd)

/*從epoll刪除檔案描述符*/

static void remove_epoll(int epoll_fd,int file_fd)

/*inotify監聽到事件的處理邏輯,將新建立的檔案新增到epoll,刪除的檔案從epoll刪除*/

static int inotify_event_handler(int epoll_fd,int notify_fd)

gfilefdarray[array_index].fd = tmp_fd;

add_to_epoll(epoll_fd,tmp_fd);

array_index += 1;

printf("add file to epoll %s\n",event->name);

}else //delete file}}

p += sizeof(struct inotify_event) + event->len;

}}int main(int argc,char** argv)

base_dir = argv[1];

//epoll建立

mepollid = epoll_create(1);

if(mepollid == -1)

minotifyid = inotify_init();

//observe directory file_create & file_delete

//inotify新增對檔案的監聽

python實現感知機

import numpy as np 定義啟用函式 def acti fun x return 1 if x 0 else 0 建立感知器類 class perception object 初始化權重 def init self self.weights 0 self.bias 1 定義訓練函式,包...

python實現AND感知機

and感知機通過訓練後,可以進行邏輯 與 的運算。例如 當輸入 1,1時,輸出為1 輸入1,0時,輸出為0。通過上圖,我們可以發現 0,0 0,1 1,0 這三個點數表示輸出為0,而點 1,1 表示輸出為1,所以我們可以近似找到一條直線將輸出為0的點與輸出為1的點分隔開。我們可以通過不斷訓練係數 即...

感知機python實現

有用請點贊,沒用請差評。感知機原理參考部落格 演算法引用李航博士 統計學習方法 p29.感知機 import numpy as np import matplotlib.pyplot as plt class perceptron object def init self,eta 1,iter 50...