Linux应用 inotify监控文件变化

1、前言

inotify是Linux内核提供的一种文件系统监控机制,可以用来监视文件系统的变化,如文件创建、删除、修改、移动等。通过inotify,用户空间程序可以实时获取文件系统的变化事件,并做出相应的处理。

主要特点:

  • 实时性:能够实时监控文件系统的变化。
  • 高效性:采用事件驱动机制,不需要轮询文件系统。
  • 灵活性:可以监控文件或目录的变化,支持递归监控

编程步骤:

  • 调用inotify_init函数初始化一个inotify实例,获取一个inotify文件描述符。
  • 使用inotify_add_watch函数向inotify实例中添加要监控的文件或目录。
  • 调用read函数读取inotify实例中发生的事件。
  • 根据事件类型做出相应的处理。

2、编程接口

2.1 inotify_init函数

初始化一个inotify实例,并返回一个inotify文件描述符。

int inotify_init(void);

返回值:

  • 成功:返回一个新的inotify实例的文件描述符。
  • 失败:返回-1,并设置errno以指示错误。

2.2 inotify_add_watch函数

用于向inotify实例添加一个监视对象,并指定需要监视的事件类型。

int inotify_add_watch(int fd, const char *pathname, uint32_t mask);

入参:

  • fdinotify实例的文件描述符。
  • pathname:要监视的文件或目录的路径。
  • mask:事件类型的掩码,可以使用OR运算符组合多个事件类型。

返回值:

  • 返回一个非负整数值作为监视描述符,用于唯一标识监视对象。
  • 返回值为负数表示添加监视失败,错误码可通过errno获取。

2.3 inotify_rm_watch函数

从inotify实例中移除监控的文件或目录。

int inotify_rm_watch(int fd, int wd);

入参:

  • fdinotify实例的文件描述符。
  • wd:要移除的监视描述符,即监视对象的标识符。

返回值:

  • 返回0表示成功移除监视对象。
  • 返回值为负数表示移除失败,错误码可通过errno获取。

2.4 struct inotify_event结构

通过read函数读取结果,结果的组织形式为struct inotify_event结构体:

struct inotify_event {
    int      wd;       /* Watch descriptor */
    uint32_t mask;     /* Mask of events */
    uint32_t cookie;   /* Unique cookie associating related events (for rename(2)) */
    uint32_t len;      /* Size of 'name' field */
    char     name[];   /* Optional null-terminated name */
};
  • int wd:监视描述符,表示事件所属的监视对象。
  • uint32_t mask:事件标志掩码,表示事件类型的位掩码,可以包括多个事件类型。
  • uint32_t cookie:关联事件的唯一标识符,用于关联相关的事件,比如重命名操作。
  • uint32_t len:文件名长度,表示name字段的长度。
  • char name[]:可选的文件名字段,存储与事件相关的文件名。

mask字段的事件类型:

  • IN_ACCESS:文件被访问。
  • IN_MODIFY:文件被修改。
  • IN_ATTRIB:文件属性被修改。
  • IN_CLOSE_WRITE:文件被关闭,写入操作完成。
  • IN_CLOSE_NOWRITE:文件被关闭,没有写入操作。
  • IN_OPEN:文件被打开。
  • IN_MOVED_FROM:文件被移动(从监视目录移出)。
  • IN_MOVED_TO:文件被移动(移入监视目录)。
  • IN_CREATE:文件或目录被创建。
  • IN_DELETE:文件或目录被删除。
  • IN_DELETE_SELF:监视的文件或目录被删除。
  • IN_MOVE_SELF:监视的文件或目录被移动。
  • IN_ISDIR:事件涉及的是目录而不是文件。
  • IN_UNMOUNT:监视的文件系统被卸载。
  • IN_Q_OVERFLOW:事件队列溢出。
  • IN_IGNORED:监视对象被移除或删除。
  • IN_ONLYDIR:只监视目录,不监视文件。
  • IN_DONT_FOLLOW:不要跟踪符号链接的目标。
  • IN_EXCL_UNLINK:监视对象必须是存在的。
  • IN_MASK_ADD:将新事件添加到现有事件掩码。
  • IN_ONESHOT:只监视一个事件,之后自动移除监视。
  • IN_CLOSE:文件被关闭(等同于IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)。
  • IN_MOVE:文件被移动(等同于IN_MOVED_FROM | IN_MOVED_TO)。

3、编程测试

编写程序监控当前文件夹下文件的添加和删除操作,测试代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/inotify.h>
#include <unistd.h>

#define EVENT_SIZE      (sizeof(struct inotify_event))
#define BUF_LEN         (1024 * (EVENT_SIZE + 16))
#define MONITOR_PATH    "./"

int main() 
{
    int fd, wd;
    char buffer[BUF_LEN];

    fd = inotify_init();
    if (fd < 0) 
    {
        perror("inotify_init");
        exit(EXIT_FAILURE);
    }

    wd = inotify_add_watch(fd, MONITOR_PATH, IN_ALL_EVENTS);
    if (wd < 0) 
    {
        perror("inotify_add_watch");
        exit(EXIT_FAILURE);
    }

    printf("Monitoring directory %s ...\n", MONITOR_PATH);

    while (1) 
    {
        int length = read(fd, buffer, BUF_LEN);
        if (length < 0) 
        {
            perror("read");
            exit(EXIT_FAILURE);
        }

        int i = 0;
        while (i < length) 
        {
            struct inotify_event *event = (struct inotify_event *)&buffer[i];
            if (event->mask & IN_CREATE) 
            {
                printf("File %s created\n", event->name);
            } 
            else if (event->mask & IN_DELETE) 
            {
                printf("File %s deleted\n", event->name);
            }
            i += EVENT_SIZE + event->len;
        }
    }

    close(fd);
    return 0;
}

测试结果如下,程序可以捕获到当前文件夹下文件的创建和删除信息:

4、总结

本文讲述了inotify的定义、编程步骤以及常用接口,并编写程序进行测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/451043.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++进阶之路---二叉搜索树详解 | 具体实现

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、二叉搜索树简介 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&am…

设计模式九:装饰器模式

文章目录 1、装饰器模式2、示例3、装饰器模式与适配器模式4、装饰器模式和代理模式5、java io流的装饰器模式 1、装饰器模式 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种类型的设计模式属于结构…

H5 微商宣传引流跳转微信单页源码

源码名称&#xff1a;H5 微商宣传引流跳转微信单页源码 源码介绍&#xff1a;一款微商宣传引流单页源码&#xff0c;源码带有导师微信二维码&#xff0c;点击复制微信号并跳转到微信功能【跳转后需自行贴贴搜索】。可用于各种微商团队宣传。 需求环境&#xff1a;H5 下载地址…

如何将应用一键部署至多个环境?丨Walrus教程

在 Walrus 平台上&#xff0c;运维团队在资源定义&#xff08;Resource Definition&#xff09;中声明提供的资源类型&#xff0c;通过设置匹配规则&#xff0c;将不同的资源部署模板应用到不同类型的环境、项目等。与此同时&#xff0c;研发人员无需关注底层具体实现方式&…

基与HTML5的塔防游戏设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 项目背景与相关技术 3 1.1 背景与发展简介 3 1.2 HTML5技术及其优势 4 1.3 JavaScript开发的优势与劣势 4 1.4 CSS样式表在开发中的用处 5 1.5 本章小结 6 2 系统分析 7 2.1 需求分析 7 2.2 问题分析 7 2.3 流程设计 7 2.3 功能分析 8 2.…

私立医院的革命者:大数据解决方案全面解析

第一部分&#xff1a;背景 在信息化飞速发展的今天&#xff0c;医疗行业正经历着一场深刻的数字化转型。特别是对于私立医院来说&#xff0c;要在这个变革的浪潮中立于不败之地&#xff0c;就必须拥抱新技术&#xff0c;优化服务流程&#xff0c;提高医疗质量。大数据技术&…

基于深度学习的植物类别检测系统(含UI界面、yolov8、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8 yolov8主要包含以下几种创新&#xff1a;         1. 可以任意更换主干结构&#xff0c;支持几百种网络主干。 数据集&#xff1a;     网上下载的数据集&#x…

【Linux】常见的基本指令(下)

在本篇博客中&#xff0c;继续介绍Linux的常见的基本指令。 一.find指令 find指令是一条搜索指令&#xff0c;在目录结构中搜索文件。 find [目录名] -name [文件名] 在指定的目录下以文件名的搜索方式去搜索文件 二.which指令 which指令是只用来搜索命令在那个路径下…

Ableton Live 12 Suite:音乐创作的全能工作站 mac版

在数字音乐制作的领域中&#xff0c;Ableton Live 11 Suite 无疑是引领潮流的旗舰产品。作为一款综合性的音乐制作和演出软件&#xff0c;它提供了从创作灵感的萌芽到最终作品完成的全方位解决方案。 Ableton Live 12 Suite Mac版软件获取 Ableton Live 11 Suite 凭借其强大的…

登录与注册功能(简单版)(1)登录

目录 1、需求 2、怎样实现 3、步骤 1&#xff09;创建login.html 2&#xff09;创建user数据表 3&#xff09;IDEA连接数据库 4&#xff09;pom.xml中添加MyBatis和MySQL驱动坐标 5&#xff09;创建User实体类 6&#xff09;创建UserMapper.xml映射文件 7&#xff0…

实体好做,还是电商好做?最适合新手的是哪种?

我是电商珠珠 时间过得很快&#xff0c;距离2025年转眼间也就只剩下了9个月&#xff0c;部分人想要充分利用自己的时间去做一些可以赚钱的项目。 现在创业要么做实体店&#xff0c;要么做自媒体&#xff0c;要么就做电商。按照现在的经济发展趋势&#xff0c;开实体店甚至不能…

Tiktok视频播放为何为0?4大原因小白需了解

原因一、养号失败&#xff0c;被判为营销号 注册了tiktok账号以后&#xff0c;是需要一段时间进行养号&#xff0c;培养账号权重的&#xff01;而有些小伙伴未经养号&#xff0c;直接注册上手开始发视频&#xff01;这样很容易导致视频没有播放&#xff01;因为这样连续的一系…

比派电器T6白色系高速吹风机,高品质保证下,追求极致性价比

广东比派电器科技有限公司于2020年成立于东莞市松山湖高新技术企业园区融易大厦&#xff0c;公司聚焦于小家电的研发&#xff0c;生产&#xff0c;销售。专注在小家电的PCBA研发&#xff0c;产品设计&#xff0c;成品生产。提供小家电产品一站式解决方案&#xff0c;致力于成为…

铁威马TOS 6即将登场,全新设计更多功能抢先看!

错过了TOS 6内测的铁粉们注意啦&#xff01; 很高兴与大家宣布 铁威马TOS 6 Beta 将在本月与大家见面 时隔一年多 TOS 6历经严格测试与精细优化 焕然一新的用户界面 由内而外展现全新风采 今天小马就来给大家小剧透 TOS 6新功能抢先看 TOS 6是铁威马迄今为止“最友好最美…

深度强化学习(三)(DQN)

深度强化学习&#xff08;三&#xff09;DQN与Q学习 一.DQN 通过神经网络来近似最优动作价值函数 Q ∗ ( a t , s t ) Q_*(a_t,s_t) Q∗​(at​,st​),在实践中, 近似学习“先知” Q ⋆ Q_{\star} Q⋆​ 最有效的办法是深度 Q \mathrm{Q} Q网络 (deep Q network, 缩写 DQN)…

Java进程CPU高负载排查

Java进程CPU高负载排查步骤_java进程cpu使用率高排查_YouluBank的博客-CSDN博客 【问题定位】使用arthas定位CPU高的问题_arthas cpu高_秋装什么的博客-CSDN博客 CPU飙升可能原因 CPU 上下文切换过多。 对于 CPU 来说&#xff0c;同一时刻下每个 CPU 核心只能运行-个线程&…

深度学习模型部署(六)TensorRT工作流and入门demo

TensorRT工作流程 官方给出的步骤&#xff1a; 总结下来可以分为两大部分&#xff1a; 模型生成&#xff1a;将onnx经过一系列优化&#xff0c;生成tensorrt的engine模型 选择batchsize&#xff0c;选择精度precision&#xff0c;模型转换 模型推理&#xff1a;使用python或…

SpringBoot(容器功能)

文章目录 1.Configuration 添加/注入bean1.注入bean1.编写一个JavaBean&#xff0c;Monster.java2.创建一个config文件夹&#xff08;名字任意&#xff09;&#xff0c;用于存放配置Bean的类&#xff08;相当于配置文件&#xff09;3.BeanConfig.java4.测试使用 MainApp.java2.…

Spring中使用自带@Autowired注解实现策略模式

场景 SpringBoot中策略模式工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else&#xff1a; SpringBoot中策略模式工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else_springboot编写策略工厂-CSDN博客 设计模式…

NASA和IBM联合开发的 2022 年多时相土地分类数据集

简介 美国国家航空航天局&#xff08;NASA&#xff09;和国际商业机器公司&#xff08;IBM&#xff09;合作&#xff0c;利用大规模卫星和遥感数据&#xff0c;包括大地遥感卫星和哨兵-2 号&#xff08;HLS&#xff09;数据&#xff0c;创建了地球观测人工智能基础模型。通过奉…