有時候我們需要檢測某個目錄下檔案或者子目錄的改動狀況,如新增、刪除、以及更新等,linux系統上提供了inotify來完成這個功能。inotify是在版本2.6.13的核心中首次出現,現在的發行本應該都包含這個系統呼叫了。
下面的描述中的檔案如無特別說明包括檔案以及目錄
使用inotify的第一步就是呼叫inotify_init()建立乙個inotify例項,該函式返回乙個檔案描述符。這個檔案描述符關聯了乙個inotify事件佇列,通過read讀取該檔案描述符,就能獲取底層的inotify事件。
1int
inotify_fd = inotify_init();
還有另外乙個系統呼叫inotify_init1(int flag),該函式提供了乙個引數可用於設定檔案描述符屬性
1int
inotify_fd = inotify_init1(flag);
其效果與如下**相同12
int
inotify_fd = inotify_init();
fcntl(inotify_fd, f_setfl, flags)
一旦成功建立了inotify例項,獲得了相應的檔案描述符,下一步就是告訴核心需要關注的檔案以及關注的事件型別。這一步是通過函式inotify_add_watch()實現的。
1int
wd = inotify_add_watch(instance_fd, file_name, event_mask)
上面的呼叫中,file_name就是需要關注的檔案,而event_mask是關注的事件型別掩碼。目前inotify支援的事件型別包括如下幾種
in_access
in_attrib
in_close_write
in_close_nowrite
in_create
in_delete
in_delete_self
in_modify
in_move_self
in_moved_from
in_moved_to
in_open
這裡面值得注意的是in_delete、in_move_to和in_delete_self、in_move_self,簡單來說帶有self結尾的事件,發生在被關注目錄自身,而不帶self的發生在關注物件的子目錄或者子檔案之上。例如對於目錄a呼叫inotify_add_watch,如果目錄a中的檔案b被刪除,核心會發出in_delete事件,而目錄a被刪除,核心發出in_delete_self事件。
如果決定不再關注某個檔案,只需呼叫inotify_rm_watch(instance_fd, wd)即可,其中的wd為inotify_add_watch的返回值。
設定好了關注檔案以及事件型別,剩下的就是inotify事件的處理了。
首先第一步就是要獲取inotify事件,這一步非常簡單,只需要對於instance_fd呼叫read進行讀取即可。注意,read讀出的資料只是一些字串行,你要通過強制轉換才能獲得inotify_event12
3456
7struct
inotify_event ;
具體的含義可以使用man命令去看,值得一體的是mask欄位和cookie欄位。這裡的mask欄位除了包含事件型別之外,還可能包含其他資訊,諸如in_isdir標示事件是否是發生在目錄之上,in_umount標示關注物件所在檔案系統是否被解除安裝等。
windows下也有類似的系統呼叫readdirectorychanges
Linux下的packet socket使用總結
上節講到的raw socket雖然已經能處理ip層的資料了,但是在實際的應用中可能需要獲取更加底層的報文資訊。這就需要用到另一種更加強大的socket建立方式 packet socket,建立之後直接可以操作包括以太層在內的報文資料。packet socket的建立方式如下 socket af pa...
linux下的EDA primetime使用
primetime是進行靜態時序分析 sta 的工具,根據設計者給出的時序約束來對電路進行分析觀察設計是否滿足時序要求。pt能夠提供以下檢查 建立時間和保持時間檢查 時鐘脈衝寬度的檢查 時鐘門的檢查 未約束的時鐘端點 組合反饋迴路等。需要注意的是pt的輸入檔案是門級網表,一般先要通過dc將rtl級電...
Linux下的packet socket使用總結
pcap的實現即基於此介面,在實際專案中因為經常因為開源軟體被審計,自己使用此介面實現了二層報文的收發。介面使用如下 上節講到的raw socket雖然已經能處理ip層的資料了,但是在實際的應用中可能需要獲取更加底層的報文資訊。這就需要用到另一種更加強大的socket建立方式 packet sock...