某些应用程序需要对文件或者目录进行监控,来侦测其是否发生了某些事件。Linux很贴心的为我们提供了inotify API,也是Linux的专有。

inotify API

在使用之前一定要有一个inotify实例,int inotify_init(void);返回一个inotify实例的描述符。

添加监控描述符,int inotify_add_watch(int fd,const char *pathname,unit32_t mask);参数解释:fd就是init返回的描述符,pathname就是你要监控的文件或者目录的路径名,mask这个是用来表示你要监控的事件类型。

删除监控描述符,int inotify_rm_watch(int fd,uint32_t wd);参数解释:fd还是你要操作的描述符,wd是你要删除监控描述符号。

inotify事件

inotify事件实现原理

原理肯定需要数据结构来支撑了,先来一个inotify的通知事件数据结构:

struct inotify_event{
    int       wd;监控描述符
    uint32_t  mask;发生的事件
    uint32_t  cookie;这个专为文件重命名而生,源文件所在监控会产生一个IN_MOVED_FROM事件,重命名后文件所在监控会产生一个IN_MOVED_TO事件(如果在同一个监控下重命名,会对这个监控项产生这两个事件)。这两个事件的cookie值相等,方便应用程序将他俩事件关联起来。多么巧妙而朴实的设计啊。
    uint32_t  len;name字符串的长度
    char      name[];表示受监控目录下发生事件的文件名,以\0结尾。\0结尾后可能有填充字符。
}

这个地方我要吐槽下这个char name[];C不支持但是C++支持。在算结构体大小的时候,他的大小为0。但是我们为这个char name[]开辟空间的时候,可以通过直接添加长度。举例说明一下,我要用这个结构体去填充我的一个buffer,char buffer[LEN];我们可以这么定义LEN:#define LEN 10*(sizeof(struct inotify_event)+10),这样我们的buffer的数据空间就可以用下图来表示。

调用read就能从内核读取所发生的事件,如果事件队列为空,read就阻塞。

Linux 监控文件事件的更多相关文章

  1. 【不积跬步,无以致千里】五个常用的Linux监控脚本代码

    为大家提供五个常用Linux监控脚本(查看主机网卡流量.系统状况监控.监控主机的磁盘空间,当使用空间超过90%就通过发mail来发警告.监控CPU和内存的使用情况.全方位监控主机),有需要的朋友不妨看 ...

  2. Linux ---> 监控JVM工具

    Linux ---> 监控JVM工具shkingshking 发布时间: 2013/10/10 01:27 阅读: 2642 收藏: 26 点赞: 1 评论: 0 JDK内置工具使用 jps(J ...

  3. Linux监控

    第三十次课 Linux监控 目录 一. Linux监控平台介绍 二. zabbix监控介绍 三. 安装zabbix 四. 忘记Admin密码如何做 五. 主动模式和被动模式 六. 添加监控主机 七. ...

  4. zabbix系列 ~ linux监控相关

    Linux 监控 一 相关名词解释    cpu context switch (上下文切换)   1 定义 CPU给每个任务一定的服务时间,当时间片轮转的时候,需要把当前状态保存下来,同时加载下一个 ...

  5. Linux监控平台、安装zabbix、修改zabbix的admin密码

    1.Linux监控平台 2. zabbix监控 3.zabbix的安装下载:wget -c https://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbi ...

  6. Linux监控重要进程的实现方法

    Linux监控重要进程的实现方法 不管后台服务程序写的多么健壮,还是可能会出现core dump等程序异常退出的情况,但是一般情况下需要在无 人为干预情况下,能够自动重新启动,保证服务进程能够服务用户 ...

  7. Linux 监控分析

    一.硬件基础 Cpu   逻辑的处理.计算.判断 现代分时多任务操作系统对 CPU 都是分时间片使用的:比如A进程占用10ms,然后B进程占用30ms,然后空闲60ms, 再又是A进程占10ms,B进 ...

  8. 几个常用的Linux监控脚本

    几个常用的Linux监控脚本 几个常用的Linux监控脚本下面是几个主机监控的脚本,大家可以根据自己的情况再进行修改,希望能给大家一点帮助.1.查看主机网卡流量#!/bin/bash#network# ...

  9. LINUX监控一:监控命令

    简单的整理一下常用的linux监控命令 本篇参考了:http://www.cnblogs.com/JemBai/archive/2010/07/30/1788484.html的内容 1.top top ...

随机推荐

  1. User already has more than 'max_user_connections' active connections

    vi /etc/my.cnf修改  max_user_connections 参数的数值,重启 MySQL 服务器

  2. asp.net URL DES加密 什在URL中的使用

    DES 加密 有时会有 + = 这些特殊字符串 Server.UrlDecode(Request["UserName"]) //能解决  = 号,但是 +号会变成空格 HttpUt ...

  3. 将MyEclipse中的项目导入到Eclipse中报错的解决放法

    1.导入项目后,会报红色感叹号, 将项目右键,点击红色框.

  4. BJFU 1397 致我们终将逝去的爱情

      LIS 由于要记录轨迹,所以不能用O(nlogn)优化,直接dp加father记录每个节点的转移. #include<cstdio> #include<algorithm> ...

  5. Jekyll: .md to .html with self defined themes..

    theme is from here $ gem install jekyll bundler ~ $ jekyll new my-awesome-site ~ $ cd my-awesome-sit ...

  6. Webdriver实现对菜单栏的灵活切换功能,附上代码,类似的菜单栏切换可以自己封装

    有时一级菜单下可能会有二级菜单,这时就需要对其下面的元素进行判断,如果使用webdriver原生的方法去获取未知的元素进行判断,显然是不可能的,因为webdriver本身就是基于明确的元素进行定位的, ...

  7. Oracle结构知识学习+部分函数实例

    一 Oracle的结构1 实例(instance) 是内存和后台进程的集合, 数据库是数据的物理储存;实例和数据库的关系是一对多的关系;2 多个实例同时驱动一个'数据库'的架构 叫集群(RAC)3 O ...

  8. 使用非 GUI 模式运行 JMeter 压力测试

    使用非 GUI 模式,即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资源.使用命令jmeter -n -t <testplan filename> -l <list ...

  9. python解决接口测试获取手机验证码问题

    最近在做接口测试的时候遇到一个问题,就是有个很重要的接口要用到手机短信验证码,而其他接口都依赖于这个验证码,如果没有短信验证码就不能进行下面接口的测试,所以为了定时的验证线上的接口是否正常,而且又不修 ...

  10. putty 默认设置

    打开 在 title上 点击 change settings / 或直接打开 设置面板 ,session 写  Default Settings  点击  save   OK 另外 在 window- ...