【Linux】【INotify与Epoll机制】

LinuxINotify与Epoll:文件系统监控与事件处理的深度解析
本文详细介绍了Linux内核的INotify和Epoll两种文件系统监控机制,包括INotify的使用方法、原理、事件处理,以及如何结合Epoll实现高效事件监听,以提升在大量并发连接中的CPU利用率。

 系列文章

可跳转到下面链接查看下表所有内容https://blog.youkuaiyun.com/handsomethefirst/article/details/138226266?spm=1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.youkuaiyun.com/handsomethefirst/article/details/138226266?spm=1001.2014.3001.5501


1.INotify

1.1 简介

INotify是一个Linux内核所提供的一种文件系统变化通知机制。它可以为应用程序监控文件系统的变化,如文件的创建、删除、读写等。当监听的文件发生相应的操作时,可以通过read函数从INotify中读取事件。

1.2 如何使用?

第一步:通过inotify_init()创建一个inotify对象。
第二步:通过inotify_add_watch将一个或多个监听添加到inotify对象中。
第三步:当事件发生时,通过read()函数从inotify对象中读取监听事件。
第四步:消费事件。

//第一步:通过inotify_init()创建一个inotify对象。
int notifyfd = inotify_init();

//第二步:监听此notify fd
int watchnotifyfd = inotify_add_watch(notifyfd,"/data", IN_CREATE | IN_DELETE);
    //监听data目录下是否有设备的添加和删除事件
    if (watchnotifyfd < 0) {
        
        return 0;
    }

//第三步:当事件发生时,通过read()函数从inotify对象中读取监听事件。
struct inotify_event *event;
char *p;
char buf[256] ={0};
ssize_t recvLen = read(notify_fd, buf, DEFAULT_BUF_LEN);//从notify的fd中读取消息等到buf中
//返回的是读取的字节数
         
for(p = buf;p<buf +recvLen;)
{
      event = (struct inotify_event*) p;
      uint32_t len = event->len;//len是event中name的长度
      event->name[len] = '\0';//给字符数组最后一位添加\0
             
      if(event ->mask & IN_DELETE)
      {//此时是删除设置事件                           
      }
      else if(event ->mask & IN_CREATE)//此时是增加设备事件
       {
       //第四步:消费事件
       }
             
       p += sizeof(struct inotify_event) + event->len;//指针向后移动,处理下一个事件                      
}               

1.3 原理介绍

INotify主要有两个基本对象。分别是inotify对象和watch对象。

1.3.1 inotify对象

Inotify对象对应了一个队列,应用程序可以向inotify对象添加多个监听。当监听的文件发生相应的操作时,可以通过read函数从INotify中读取事件。

inotify_init 是一个 Linux 系统调用,用于初始化 inotify实例并返回一个文件描述符,该文件描述符可以用于后续的inotify事件监听。inotify是Linux内核提供的一种文件系统事件监控机制,它允许应用程序监控文件或目录的更改,包括文件的打开、关闭、修改、移动或删除等操作。

创建方法如下:

int inotifyFd = inotify_init();
//inotify_init(void),该函数没有参数,并返回一个非负整数作为inotify实例的文件描述符。
//如果初始化失败,它会返回-1,并设置全局变量errno来指示错误原因。
//一旦你获得了inotify实例的文件描述符,你可以使用inotify_add_watch函数来指定要监控的文件或目录,
//以及你感兴趣的事件类型(如IN_MODIFY、IN_DELETE、IN_CREATE等)。
//然后,你可以使用read系统调用来从inotify实例的文件描述符中读取事件。

1.3.2 Watch对象

watch对象则用来描述文件系统的变化事件的监听。其包含监听目标和事件掩码。监听目标可以文件也可以是文件夹。事件掩码则是监听的事件的类型。文件的创建是IN_CREATE,文件的删除是IN_DELETE等。

其创建方法和inotify对象关联如下:

int watchid = inotify_add_watch (inotifyFd, “/dev/input”,IN_CREATE);
//原型:int inotify_add_watch(int fd, const char *pathname, uint32_t mask);
//参数说明:
//fd:由 inotify_init 返回的 inotify 实例的文件描述符。
//pathname:指向要监视的文件或目录路径的字符串。
//mask:一个位掩码,表示你感兴趣的inotify事件类型。可以使用预定义的宏(如 IN_CREATE、IN_DELETE、IN_MODIFY 等)来指定多个事件类型。

//inotify_add_watch 返回一个非负整数,称为监视描述符(watch descriptor),它唯一标识了新添加的监
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值