某些应用程序需要对文件或者目录进行监控,来侦测其是否发生了某些事件。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. RFC3489 STUN之客户端所处环境探测流程与部分属性含义说明

    1 STUN客户端所处环境探测流程 1.1 流程图 1.2 流程图中Binding请求类型说明 类型1:Binding请求消息中不设置CHANGE-REQUEST,或若设置其相应更改IP与端口标志位都 ...

  2. DPI与PPI

    首先应该明白几个概念: 1寸=3.3333333厘米(cm)1英寸(in)=2.54厘米(cm)屏幕尺寸: 屏幕对角线的长度.电脑电视同理.LCD是由液态晶体组成的显示屏(本向不发光) 有于电脑手机显 ...

  3. apicloud教程3 (转载)

    本帖最后由 中山赢友网络科技有限公司 于 2015-10-26 16:44 编辑 继<APICloud之小白图解教程系列(一):认识APICloud><APICloud之小白图解教程 ...

  4. 阅读《大道至简第一章》读后感(java伪代码)

    大道至简讲述的是软件工程实践者的思想,书的第一章引用了著名的----愚公移山这一历史故事,向我们讲述了编程的精义.汤问篇中所述的愚公移山这一事件,我们看到了原始需求的产生---“惩山北之塞,出入之迂” ...

  5. TCP网络编程小结

    一.套接字编程基础 1.套接字地址结构 通用的地址结构是 struct sockaddr{ unsigned short sa_family; ]; } IPv4的套接字地址结构是 struct in ...

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

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

  7. 利用socket模块检查端口存活并邮件警报

    可以用来监控一些端口. import socket def check_server(addr, port): s = socket.socket() try: s.connect((addr, po ...

  8. mysql基本操作 [http://www.cnblogs.com/ggjucheng/archive/2012/11/03/2752082.html]

    创建表 简单的方式 CREATE TABLE person ( number INT(11), name VARCHAR(255), birthday DATE ); 或者是 CREATE TABLE ...

  9. java程序使用memcached

    Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. 1.linux环境下安装与启动memcache: 以编译安装的方式安装.具体参看: http://wang ...

  10. CSS3秘笈:第二章

    1.一个样式由两个元素组成:浏览器对其设置格式的网页元素(选择器,selector)和实际的格式化指令(声明块,declaration block). 2.简单的样式也包含了以下几个元素: (1)Se ...