Linux下inotify的基本使用及注意事项

【产品化】Linux文件实时监控之inotify 产品化过程中,使用linux inotify机制的一些踩坑点,帮助大家开发过程中避免踩坑 阅读详情

最近在写一个云备份的项目,其中有一个模块是要监控计算机本地的文件,于是我翻了翻linux/unix系统编程手册发现了inotify这个用于文件监控的框架

1.概述

1)inotify机制可用于监控文件或目录。当监控目录时,与该目录自身以及该目录下面的文件都会被监控,其上有事件发生时都会通知给应用程序

2)inotify监控机制为非递归,若应用程序有意监控整个目录子树内的事件,则需对该树中的每个目录发起inotify_add_watch()调用

3)可使用select(),poll(),epoll()以及由信号驱动的I/O来监控inotify文件描述符

2.inotify API

1)inotify_init()系统调用可创建一新的inotify实例

#include<sys/inotify.h>
int inotify_init(void);

该函数的返回值为一个文件描述符,我们可以简单的理解为该文件描述符所指代的文件中将会保存类似所监控的目录所发生的事件集

2)针对fd所指的inotify实例的监控列表,系统调用inotify_add_watch()可以追加新的监控项

#include<sys/inotify.h>
int inotify_add_watch(int fd,const char *pathname,uint32_t mask);

参数pathname为想要创建的监控项所对应的文件,特别注意调用该接口必须要对该文件有读权限,该函数只对文件做一次检查,如果在监控时修改了所监控的文件读权限,则不会影响继续监控此文件

参数mask为一位掩码,针对pathname定义了想要监控的事件,此函数的返回值为一个用于唯一指代此监控项的描述符

3.inotify事件

IN_ACCESS				文件被访问
IN_ATTRIB				文件元数据改变
IN_CLOSE_WRITE			关闭为了写入而打开的文件
IN_CREATE				在受监控目录下创建了文件或目录
IN_DELETE				在受监控目录内删除了文件或目录
IN_DELETE_SELF			删除了受监控目录/文件本身
IN_MODIFY				文件被修改
IN_MODIFY_SELF			移动受监控目录或文件本身
IN_MOVED_FROM			文件移除受监控目录
IN_MOVED_TO			将文件移到受监控目录
IN_OPEN					文件被打开

IN_ALL_EVENTS			以上所有输出事件的统称
IN_MOVE				IN_MOVED_FROM | IN_MOVED_TO事件的统称
IN_ONESHOT				只监控pathname的一个事件
IN_ONLYDIR				pathname不为目录时会失败

对于上述一些事件的说明:

1)当文件的元数据(比如,权限,所有权,链接计数,扩展属性,用户ID,或组ID等)改变时,会发生IN_ATTRIB事件

2)删除受监控对象时会发生IN_DELETE_SELF

3)重命名对象时会发生IN_MORE_SELF事件

4)ONE_SHOT允许只监控pathname的一个事件,事件发生后,监控项会自动从监控列表消失


4.读取inotify事件

将监控项项在监控列表中登记后,应运程序可用read()从inotify的文件描述符中读取事件,以判定发生了那些事件。若读取之时还没有发生任何事件,则read()会阻塞,直至有事件产生,事件发生后,每次调用read()会返回一个缓存区,内含一个或多个如下类型的结构体

struct inotify_event
{
<span style="white-space:pre">	</span>int wd;
<span style="white-space:pre">	</span>uint32_t mask;
<span style="white-space:pre">	</span>uint32_t cookie;
<span style="white-space:pre">	</span>uint32_t len;
<span style="white-space:pre">	</span>char name[];
}
.字段wd指名发生事件的是哪个监控描述符,该字段值由之前对inotify_add_watch()的调用返回。因为用read()读到的是inotify文件中的所有事件,可是当inotify同时监控多个目录或文件时我们应该如何区分读到的内容呢,这是wd就派上了用场,我们可以用wd来做区分

.mask字段返回了描述该事件的位掩码

.cookie字段将相关事件联系到一起,目前只有对重命名时才会用到

.len字段表示实际分配给name字段的字节数

.name字段则是标示该文件


5.简单程序事例

#include<stdio.h>
#include<assert.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<sys/inotify.h>
#include<limits.h>
#include<fcntl.h>


#define BUF_LEN 1000

void displayInotifyEvent(struct inotify_event *i)
{
	printf("  wd = %2d; ",i->wd);

	if(i->cookie > 0)
	{
		printf("cokkie = %4d; ",i->cookie);
	}

	printf("mask = ");

	if(i->mask & IN_ACCESS)   printf("IN_ACCESS\n");
	if(i->mask & IN_DELETE_SELF)   printf("IN_DELETE_SELF\n");
	if(i->mask & IN_MODIFY)  printf("IN_MODIFY\n");
	if(i->mask & IN_OPEN)   printf("IN_OPEN\n");

	
		if(len > 0)
		{
			printf("name = %s\n",i->name);
		}
	

}

int main(int argc,char **argv)
{
	int inotifyFd,wd,j;
	char buf[BUF_LEN];
	ssize_t numRead;
	char *p;
	struct inotify_event *event;
	int flags;



	if(argc < 2 )
	{
		printf("error\n");
	}

	inotifyFd = inotify_init();
	if(inotifyFd == -1)
	{
		printf("初始化失败");
	}

	wd = inotify_add_watch(inotifyFd,argv[1],IN_ALL_EVENTS);
	if(wd == -1)
	{
		printf("error\n");
	}

	printf("Watching %s using wd %d\n",argv[1],wd);

	

	while(1)
	{
		numRead = read(inotifyFd,buf,BUF_LEN);
		if(numRead == -1)
		{
			printf("read error\n");
		}

		printf("Read %ldbytes from inotify fd\n",(long)numRead);
		for(p=buf;p < buf+numRead;)
		{
			event = (struct inotify_event *)p;
			displayInotifyEvent(event);
			p+=sizeof(struct inotify_event) + event->len;
		}
	}

	return 0;

}





ESXI 7 :创建统信V20_1050d服务器系统虚拟机 记录一下在 X86 架构创建统信V20_1050d 虚拟机遇到的问题。已遇到的问题有①:常规服务器环境下网络连接失败重点:按照桌面版本,有问题处理简单。 阅读详情

相关推荐

手把手教你离线部署bert-base-uncased模型(附完整文件清单)

本文提供了一份详尽的bert-base-uncased模型离线部署指南。针对严格内网或无网络环境,文章不仅列出了包括config.json、pytorch_model.bin在内的完整必需文件清单,还详细解释了每个文件的作用,并给出了使用snapshot_download工具或手动下载的两种文件获取方法。重点阐述了如何正确设置本地路径、编写健壮的加载代码,并通过多层次验证确保模型在离线环境下成功运行,有效解决了部署过程中常见的文件缺失和路径错误问题。

weixin_29034963的博客 316

Linux之了解inotify监听文件变化机制

一、Inotify 简介 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在日常的运维过程中,经常需要备份某些文件,或者对系统的某些文件进行监控,比如重要的配置文件等。如果需要作到实时同步或者监控,就需要使用内核的inotify机制 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inotify 是基于inode级别的文件系统

hdyebd的博客 2737

WPS Office 2026免费安装指南:AI办公与安全使用全解析

办公软件作为数字化办公的核心工具,其基本原理是通过文档处理、数据计算和演示展示等功能模块满足用户日常办公需求。随着人工智能技术的发展,现代办公软件逐步集成AI能力,通过自然语言处理和数据分析算法提升工作效率。在技术价值层面,优秀的办公软件不仅需要保持格式兼容性和跨平台同步能力,更要注重用户数据安全防护。从应用场景来看,无论是个人文档编辑、企业报表分析还是团队协作演示,办公软件都发挥着关键作用。WPS Office 2026作为国产办公软件代表,深度融合AI助手功能,支持智能写作和数据分析,同时通过官方免费策

weixin_30599769的博客 704

inotify使用帮助

inotify是用来监视文件系统事件的机制,在linux 2.6.13内核中引入。该机制可以用来监视文件和目录,当文件或目录发生变化时,内核会将文件或目录的变化发送给inotify文件描述符,在应用层只需调用read()就可以读取这些事件,非常的方便。更好的是,inotify文件描述符还可以使用select、poll、epoll这些接口来监听,当有事件发生是,inotify文件描述符会可读。 一

迷路的专栏 6232

Tartancalib标定OAK-FFC_4p(上)

1.使用Tartancalib标定双目或多目相机前,先对单个相机标定获得内参,再获得外参。

qq_51731421的博客 1276

STK传感器约束设置保姆级教程:从方位角到传播延迟,手把手教你避开新手常见坑

本文详细解析了STK传感器约束设置的关键技巧,涵盖方位角、仰角、高度及传播延迟等核心参数。通过实战案例和代码示例,指导用户避开常见误区,优化卫星通信和航天任务仿真精度,特别适合STK新手和需要提升传感器配置效率的工程师。

weixin_33701294的博客 392

Linux inotify功能及原理(inotify_init、inotify_add_watch、inotify_rm_watch、read)

一、inotify 主要功能它是一个内核用于通知用户空间程序文件系统变化的机制。开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好的服务,如 hotplug、udev 和 inotify 就是这种需求催生的。inotify 是文件系统变化通知机制,在监听到文件系统变化后,会向相应的应用程序发送事件。

布袋和尚 1395

今日指数项目之实时流数据采集【六】

实时数据采集代码

Maynor的博客 2145

linux - inotify

1. inotify主要功能 它是一个内核用于通知用户空间程序文件系统变化的机制。 众所周知,Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好的服务,如 hotplug、udev 和 inotify 就是这种需求...

www.v5qq.com的技术博客 446

ardupilot开发 --- MavLink 篇

ardupilot开发 --- MavLink 篇

记录老板的每次pua,分享领导每天的毒鸡汤... 4248

【第2章>第10节】深度学习DenseNet模型分析与matlab仿真

本文介绍了基于DenseNet深度学习模型的图像分类MATLAB实现方法。主要内容包括:1. DenseNet模型原理,详细解析了初始卷积层、密集块、过渡层等核心结构;2. 在MATLAB环境下完成DenseNet工具箱安装和测试样本准备;3. 实现图像预处理(统一缩放为224×224)、模型训练和测试的完整流程;4. 提供了混淆矩阵和准确率等测试结果分析。文章附带完整的MATLAB程序代码和操作视频教程,适合深度学习初学者快速掌握DenseNet模型的图像分类应用。通过实际测试,验证了该方案的有效性。

FPGA/MATLAB学习教程/源码/项目合作开发 330

Linux inotify功能及实现原理

1. inotify主要功能 它是一个内核用于通知用户空间程序文件系统变化的机制。 众所周知,Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好的服务,如 hotplug、...

weixin_33918357的博客 715

【WRF湿度调整策略】WRF/ERA5湿度数据对比

【WRF湿度调整策略】WRF/ERA5湿度数据对比

WW、forever的博客 117

Linux inotify 内核参数详解

inotify 是 Linux 内核提供的文件系统监控机制,广泛应用于开发工具(如 IDE)、服务监控(如 Kubernetes)等场景。当事件产生速度超过处理速度时,队列会堆积,超过此值后事件将被丢弃。IDE(如 VSCode、WebStorm)监控大型项目文件变更。注意:队列过长会增加内存占用(每个事件约占用 32 字节)文件同步工具(如 rsync、inotifywait)每个监控进程(如 IDE、监控服务)至少需要一个实例。对于关键服务(如 etcd),优先保证。可以监控的文件/目录数量上限。

sre救赎之路 1557

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Linux操作系统中的事件通知机制 - 监控文件事件 inotify

使用 inotify API 有以下几个关键步骤1。应用程序使用 inotify_init()来创建 inotify 实例,该系统调用所返回的文件描述符用于在后续操作中指代该实例。应用程序使用 inotify_add_watch()向 inotify 实例(由步骤 1 创建)的监控列表添加条目,以告知内核哪些文件是自己的兴趣所在。每个监控项都包含一个路径名以及相关的位掩码。位掩码针对路径名指明了所要监控的事件集合。

Android系统工程师--小馬佩德罗 1438

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

《Linux系统编程篇》Linux目录动态检测应用 (inotify递归子目录)——工具篇

inotify(inode notify)是 Linux 内核自 2.6.13 版本开始提供的一种文件系统事件监控机制。它允许用户空间程序注册监控文件或目录,当发生特定事件时,内核会通知用户程序。与之前的dnotify相比,inotify提供了更丰富的事件类型和更高效的监控方式。

Strange_Head的博客 1451

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

inotify

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33738555的博客 93

linux inotify 监控子目录,linux监控文件系统:inotify

inotify eventsIN_ACCESS +文件被访问 read, execveIN_ATTRIB *元数据该表,例如权限,timestamp,链接数,user/group ID等等。IN_CLOSE_WRITE +可写文件被关闭IN_CLOSE_NOWRITE *非可写的文件或者目录被关闭IN_CREATE +文件或者目录在监控目录中被创建(也就是说这个事件只可能在监控目录时才可能产生)I...

weixin_30702441的博客 304

linux 中inotify与inode的关系是什么?

inode 是 Linux 文件系统中存储文件元数据(如权限、所有者、时间戳、数据块位置等)的结构,每个文件和目录都对应一个唯一的 inode。:文件系统通过 inode 找到文件数据的实际存储位置,而文件名只是 inode 的一个别名(硬链接可以指向同一个 inode)。:当文件被修改、删除或权限变更时,inode 的元数据会更新,inotify 会捕获这些变化并生成相应事件。当你监控一个文件时,inotify 关联的是该文件的 inode,而非文件路径名。:inotify 实际上监控的是。

sre救赎之路 635

inotify-win 项目常见问题解决方案

inotify-win 项目常见问题解决方案 项目基础介绍 inotify-win 是一个针对 Windows 系统的 inotify-wait 工具的移植版本。inotify-wait 是一个用于监控文件系统事件的工具,通常在 Linux 系统中使用。inotify-win 项目的主要目的是在 Windows 平台上提供类似的功能。该项目使用 C# 语言编写,适合在 Windows 环境下进行文...

gitblog_00464的博客 598

linux使用Rsync与inotify结合实现高效、实时的文件同步

Rsync与inotify结合可以实现高效、实时的文件同步,确保源服务器上的文件改动能够即时、准确地复制到目标服务器上。

学亮编程手记 835

inotify学习总结

inotify 是 Linux 内核提供的一种文件系统变化通知机制,用于实时监控文件或目录的事件(如创建、修改、删除等)。它通过内核与用户空间的交互,以异步事件驱动的方式工作,避免了轮询带来的性能开销,适用于需要实时响应的场景,如配置热重载、自动备份、文件同步等。

2501_93311146的博客 774

Linux下Rsync+Inotify-tools实现数据实时同步

Linux下Rsync+Inotify-tools实现数据实时同步 注意:下面的三个案例都是rsync 每次都是全量的同步(这就坑爹了),而且 file列表是循环形式触发rsync ,等于有10个文件发生更改,就触发10次rsync全量同步(简直就是噩梦),那还不如直接写个死循环的rsync全量同步得了。 解决方法1、做判断http://www.ttlsa.com/web/let-inf...

weixin_30802273的博客 198

MoviePilot项目inotify监控限制问题分析与解决方案

在使用MoviePilot项目进行媒体文件管理时,部分用户遇到了目录监控功能失效的问题。系统日志显示错误信息为"inotify watch limit reached",这表明系统对inotify机制的资源限制已被耗尽。 ## 技术原理 inotify是Linux内核提供的一种文件系统监控机制,它允许应用程序监视文件系统的变化。当文件或目录被创建、修改、删除时,inotify会向监控程序发送事...

gitblog_07734的博客 446
上一篇: TCP/IP详解学习笔记(2)--IP协议
下一篇: UDP单播和广播的分析与实例
Shreck66
博客等级 码龄12年 119粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值