首先學習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...