【Linux】【INotify与Epoll机制】

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

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

 系列文章

可跳转到下面链接查看下表所有内容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,并设置
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值