linux下inotify的使用
有时候我们需要检测某个目录下文件或者子目录的改动状况,如添加、删除、以及更新等,Linux系统上提供了inotify来完成这个功能。inotify是在版本2.6.13的内核中首次出现,现在的发行本应该都包含这个系统调用了。
下面的描述中的文件如无特别说明包括文件以及目录
使用inotify的第一步就是调用inotify_init()创建一个inotify实例,该函数返回一个文件描述符。这个文件描述符关联了一个inotify事件队列,通过read读取该文件描述符,就能获取底层的inotify事件。
|
1
|
int inotify_fd = inotify_init(); |
还有另外一个系统调用inotify_init1(int flag),该函数提供了一个参数可用于设置文件描述符属性
|
1
|
int inotify_fd = inotify_init1(flag); |
其效果与如下代码相同
|
1
2
|
int inotify_fd = inotify_init();fcntl(inotify_fd, F_SETFL, flags) |
一旦成功创建了inotify实例,获得了相应的文件描述符,下一步就是告诉内核需要关注的文件以及关注的事件类型。这一步是通过函数inotify_add_watch()实现的。
|
1
|
int 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_event
|
1
2
3
4
5
6
7
|
struct inotify_event {int wd;uint32_t mask;uint32_t cookie;uint32_t len;char name[]}; |
具体的含义可以使用man命令去看,值得一体的是mask字段和cookie字段。这里的mask字段除了包含事件类型之外,还可能包含其他信息,诸如IN_ISDIR标示事件是否是发生在目录之上,IN_UMOUNT标示关注对象所在文件系统是否被卸载等。
Windows下也有类似的系统调用ReadDirectoryChanges
原文地址:http://www.cnblogs.com/jimmychange/p/3498862.html
linux下inotify的使用的更多相关文章
- [转帖]Linux下inotify监控文件夹状态,发生变化后触发rsync同步
Linux下inotify监控文件夹状态,发生变化后触发rsync同步 https://www.cnblogs.com/fjping0606/p/6114123.html 1.安装工具--inotif ...
- Linux下inotify的基本使用及注意事项
最近在写一个云备份的项目,其中有一个模块是要监控计算机本地的文件,于是我翻了翻linux/unix系统编程手册发现了inotify这个用于文件监控的框架 1.概述 1)inotify机制可用于监控文件 ...
- Linux下inotify监控文件夹状态,发生变化后触发rsync同步
1.安装工具--inotifywget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar ...
- Linux下同步工具inotify+rsync使用详解
1. rsync 1.1 什么是rsync rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.它使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到同步,这 ...
- (转)Linux下同步工具inotify+rsync使用详解
原文:https://segmentfault.com/a/1190000002427568 1. rsync 1.1 什么是rsync rsync是一个远程数据同步工具,可通过LAN/WAN快速同步 ...
- (转)Linux下通过rsync与inotify(异步文件系统事件监控机制)实现文件实时同步
Linux下通过rsync与inotify(异步文件系统事件监控机制)实现文件实时同步原文:http://www.summerspacestation.com/linux%E4%B8%8B%E9%80 ...
- Linux下Rsync+sersync实现数据实时同步
inotify 的同步备份机制有着缺点,于是看了sersync同步,弥补了rsync的缺点.以下转自:http://www.osyunwei.com/archives/7447.html 前言: 一. ...
- linux下编译qt5.6.0静态库——configure配置
linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...
- Linux重启inotify配置max_user_watches无效被恢复默认值8192的正确修改方法
Linux下Rsync+inotify-tools实现数据实时同步中有一个重要的配置就是设置Inotify的max_user_watches值,如果不设置,当遇到大量文件的时候就会出现出错的情况. 一 ...
随机推荐
- 视频处理控件TVideoGrabber如何对屏幕进行录制/压缩
TVideoGrabber可以对屏幕进行录制和压缩,本文来详细的说明在多种情况下TVideoGrabber是如何实现屏幕的录制和压缩. 屏幕录制 当VideoSource = vs_ScreenRec ...
- n阶乘 尾数0的个数
class Solution {public: int trailingZeroes(int n) { if(n<=0) return 0; int i=0; ...
- [转]Windows配置Git
原文地址:http://blog.csdn.net/exlsunshine/article/details/18939329 1.从git官网下载windows版本的git:http://git-sc ...
- jqGrid中选择的行的数据[转]
如何获取jqGrid中选择的行的数据? 下面可以获取选择一行的id,如果你选择多行,那下面的id是最后选择的行的id: var id=$(‘#gridTable’).jqGrid(‘getGridPa ...
- org.apache.commons.httpclient
org.apache.commons.httpclient /** * post 方法 * @param url * @param params * @return */ public static ...
- ectouch第七讲 之ECshop模板机制整理
网上的资源感觉还是有些用,可以看看,帮助理解,ECshop模板机制整理原文:http://blog.sina.com.cn/s/blog_6900af430100nkn8.html 一.模板引擎: E ...
- 20145227 《Java程序设计》第2周学习总结
20145227 <Java程序设计>第2周学习总结 教材学习内容总结 3.1 类型.变量与运算符 1.基本类型:在java中基本类型主要分为整数.字节.浮点数.字符与布尔. 整数:分为s ...
- 利用Session实现一次验证码
Session可避免表单的重复提交:实现一次表单提交,可避免恶意提交: 1.首先建立一个Servlet类:ValidateColorServlet,里边有获取验证码的方法,并且验证码是大小写区分: p ...
- 中国行政区域(省,市,县)SQL
数据库:Region CREATE DATABASE [Region] 表:Province CREATE TABLE [dbo].[Province]( [Id] [int] NOT NUL ...
- LightOJ1002 分类: 比赛 最短路 2015-08-08 15:57 15人阅读 评论(0) 收藏
I am going to my home. There are many cities and many bi-directional roads between them. The cities ...