Linux 监控文件事件
某些应用程序需要对文件或者目录进行监控,来侦测其是否发生了某些事件。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 监控文件事件的更多相关文章
- 【不积跬步,无以致千里】五个常用的Linux监控脚本代码
为大家提供五个常用Linux监控脚本(查看主机网卡流量.系统状况监控.监控主机的磁盘空间,当使用空间超过90%就通过发mail来发警告.监控CPU和内存的使用情况.全方位监控主机),有需要的朋友不妨看 ...
- Linux ---> 监控JVM工具
Linux ---> 监控JVM工具shkingshking 发布时间: 2013/10/10 01:27 阅读: 2642 收藏: 26 点赞: 1 评论: 0 JDK内置工具使用 jps(J ...
- Linux监控
第三十次课 Linux监控 目录 一. Linux监控平台介绍 二. zabbix监控介绍 三. 安装zabbix 四. 忘记Admin密码如何做 五. 主动模式和被动模式 六. 添加监控主机 七. ...
- zabbix系列 ~ linux监控相关
Linux 监控 一 相关名词解释 cpu context switch (上下文切换) 1 定义 CPU给每个任务一定的服务时间,当时间片轮转的时候,需要把当前状态保存下来,同时加载下一个 ...
- Linux监控平台、安装zabbix、修改zabbix的admin密码
1.Linux监控平台 2. zabbix监控 3.zabbix的安装下载:wget -c https://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbi ...
- Linux监控重要进程的实现方法
Linux监控重要进程的实现方法 不管后台服务程序写的多么健壮,还是可能会出现core dump等程序异常退出的情况,但是一般情况下需要在无 人为干预情况下,能够自动重新启动,保证服务进程能够服务用户 ...
- Linux 监控分析
一.硬件基础 Cpu 逻辑的处理.计算.判断 现代分时多任务操作系统对 CPU 都是分时间片使用的:比如A进程占用10ms,然后B进程占用30ms,然后空闲60ms, 再又是A进程占10ms,B进 ...
- 几个常用的Linux监控脚本
几个常用的Linux监控脚本 几个常用的Linux监控脚本下面是几个主机监控的脚本,大家可以根据自己的情况再进行修改,希望能给大家一点帮助.1.查看主机网卡流量#!/bin/bash#network# ...
- LINUX监控一:监控命令
简单的整理一下常用的linux监控命令 本篇参考了:http://www.cnblogs.com/JemBai/archive/2010/07/30/1788484.html的内容 1.top top ...
随机推荐
- RFC3489 STUN之客户端所处环境探测流程与部分属性含义说明
1 STUN客户端所处环境探测流程 1.1 流程图 1.2 流程图中Binding请求类型说明 类型1:Binding请求消息中不设置CHANGE-REQUEST,或若设置其相应更改IP与端口标志位都 ...
- DPI与PPI
首先应该明白几个概念: 1寸=3.3333333厘米(cm)1英寸(in)=2.54厘米(cm)屏幕尺寸: 屏幕对角线的长度.电脑电视同理.LCD是由液态晶体组成的显示屏(本向不发光) 有于电脑手机显 ...
- apicloud教程3 (转载)
本帖最后由 中山赢友网络科技有限公司 于 2015-10-26 16:44 编辑 继<APICloud之小白图解教程系列(一):认识APICloud><APICloud之小白图解教程 ...
- 阅读《大道至简第一章》读后感(java伪代码)
大道至简讲述的是软件工程实践者的思想,书的第一章引用了著名的----愚公移山这一历史故事,向我们讲述了编程的精义.汤问篇中所述的愚公移山这一事件,我们看到了原始需求的产生---“惩山北之塞,出入之迂” ...
- TCP网络编程小结
一.套接字编程基础 1.套接字地址结构 通用的地址结构是 struct sockaddr{ unsigned short sa_family; ]; } IPv4的套接字地址结构是 struct in ...
- Webdriver实现对菜单栏的灵活切换功能,附上代码,类似的菜单栏切换可以自己封装
有时一级菜单下可能会有二级菜单,这时就需要对其下面的元素进行判断,如果使用webdriver原生的方法去获取未知的元素进行判断,显然是不可能的,因为webdriver本身就是基于明确的元素进行定位的, ...
- 利用socket模块检查端口存活并邮件警报
可以用来监控一些端口. import socket def check_server(addr, port): s = socket.socket() try: s.connect((addr, po ...
- 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 ...
- java程序使用memcached
Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. 1.linux环境下安装与启动memcache: 以编译安装的方式安装.具体参看: http://wang ...
- CSS3秘笈:第二章
1.一个样式由两个元素组成:浏览器对其设置格式的网页元素(选择器,selector)和实际的格式化指令(声明块,declaration block). 2.简单的样式也包含了以下几个元素: (1)Se ...