Linux中inotify详解及实例

inotify是Linux提供的一种文件系统变化通知机制,避免了繁忙轮询,提高了效率。它通过在文件系统的处理函数中放置hook实现,允许程序监控文件系统事件,如读写、创建、删除等。inotify使用包括创建实例、添加和删除watch,以及通过read获取事件。在内核中,inotify使用inotify_device和inotify_watch结构管理,并在inode结构中增加字段以支持通知。通过fsnotify_*函数,内核将文件系统事件报告给inotify系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、inotify简介

    用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好的服务,包括了hotplug、udev 和 inotify。Hotplug 是一种内核向用户态应用通报关于热插拔设备一些事件发生的机制,桌面系统能够利用它对设备进行有效的管理,udev 动态地维护 /dev 下的设备文件,

       Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建,以及卸载等操作,还可以跟踪活动的源头和目标等细节。即文件系统变化通知机制。inotify摈弃了dnotify的信号方式,采用在文件系统的处理函数中放置hook函数的方式实现。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。

 

2、inotify的使用

(1)原理

       使用 inotify 很简单:创建一个文件描述符,附加一个或多个监视器(一个监视器 是一个路径和一组事件),然后使用 read 方法从描述符获取事件。read 并不会用光整个周期,它在事件发生之前是被阻塞的。

更好的是,因为inotify 通过传统的文件描述符工作,您可以利用传统的 select 系统调用来被动地监控监视器和许多其他输入源。两种方法 — 阻塞文件描述符和使用 select— 都避免了繁忙轮询。

(2)具体使用

a、创建inotify实例

int fd = inotify_init ();

       每一个 inotify 实例对应一个独立的排序的队列。文件系统的变化事件被一个称做 watches 的对象管理,每一个 watch 是一个二元组(目标,事件掩码),目标可以是文件或目录,事件掩码表示应用希望关注的 inotify 事件,每一个位对应一个 inotify 事件。Watch 对象通过 watch描述符引用,watches 通过文件或目录的路径名来添加。目录 watches 将返回在该目录下的所有文件上面发生的事件。

b、添加一个 watch

int wd = inotify_add_watch (fd, path, mask);
  • fd:是 inotify_init() 返回的文件描述符;
  • path:是被监视的目标的路径名(即文件名或目录名);
  • mask:是事件掩码, 在头文件 linux/inotify.h 中定义了每一位代表的事件。可以使用同样的方式来修改事件掩码,即改变希望被通知的inotify 事件。
  • Wd 是 watch 描述符。

c、删除一个 watch

int ret = inotify_rm_watch (fd, wd);
  • fd 是 inotify_init() 返回的文件描述符;
  • wd 是 inotify_add_watch() 返回的 watch 描述符;
  • ret 是函数的返回值。

d、文件事件

       文件事件用一个 inotify_event 结构表示,它通过由 inotify_init() 返回的文件描述符使用通常文件读取函数 read 来获得

struct inotify_event {
        __s32           wd;             /*  watch 描述符*/
        __u32           mask;           /* 事件掩码 */
        __u32           cookie;         /* cookie to synchronize two events */
        __u32           len;            /* name字符串的长度 */
        char            name[0];        /* 被监视目标的路径名 */
};

       注,name 为被监视目标的路径名,该结构的 name 字段为一个桩,它只是为了用户方面引用文件名,文件名是变长的,它实际紧跟在该结构的后面,文件名将被 0 填充以使下一个事件结构能够 4 字节对齐。注意,len 也把填充字节数统计在内。

c、获取事件

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值