当前位置: 首页
编程语言
inotify有哪些API接口可以使用

inotify有哪些API接口可以使用

热心网友 时间:2026-05-01
转载

Linux inotify 机制详解:实现文件系统实时监控的核心技术

在Linux操作系统环境下,若需实时捕获文件或目录的动态变化——例如文件创建、内容修改、属性更新或删除操作——内核提供的inotify(inode notify)机制是实现这一需求的权威解决方案。它相当于为文件系统安装了一个高效的“事件监听引擎”,使得应用程序能够即时感知并响应各类文件事件。下图系统性地展示了inotify的核心API接口及其相互关系:

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

inotify有哪些API接口可以使用

下面,我们将对这些API进行逐一剖析,阐述它们如何协同构建一套稳定、高效的文件系统监控体系。

1. inotify_init():初始化监控实例

一切监控操作始于创建一个inotify实例。inotify_init()函数负责完成此任务,它在内核中初始化一个inotify实例,并返回一个与之关联的文件描述符。此描述符是后续所有监控操作的枢纽。调用成功则返回一个有效的文件描述符;若返回-1,则表明初始化失败,通常需要检查系统资源限制(如打开文件数上限)或调用进程的权限。

2. inotify_init1(int flags):支持附加标志的初始化

这是inotify_init()的增强版本,额外接受一个flags参数,允许在初始化时设置特定的行为标志。例如,传递IN_NONBLOCK标志可使得返回的文件描述符立即处于非阻塞模式,这对于基于事件循环或异步I/O的编程模型尤为便利。其返回值语义与inotify_init()完全相同。

3. inotify_add_watch(int fd, const char *path, uint32_t mask):添加监控目标与事件

实例创建后,需指定监控的具体目标路径及关心的事件类型。这正是inotify_add_watch函数的核心功能。

  • fd:由inotify_initinotify_init1返回的文件描述符,标识要操作的监控实例。
  • path:指向待监控文件或目录路径的字符串,通常需为绝对路径。
  • mask:事件掩码,通过位或运算符组合多种事件标志,以精确定义监控范围。常用标志包括IN_CREATE(文件/目录创建)、IN_DELETE(删除)、IN_MODIFY(内容修改)、IN_ATTRIB(元数据变更)等。

函数成功执行后,会返回一个唯一的监控描述符(Watch Descriptor),用于标识该监控项;失败则返回-1。

4. read(int fd, struct inotify_event *event, size_t len):读取监控事件

配置好监控后,内核会将发生在监控目标上的事件放入与文件描述符关联的队列中。应用程序通过标准的read系统调用从该描述符读取事件(inotify实例本身是一个可读的文件描述符)。

  • fd:inotify实例的文件描述符。
  • event:指向用户提供的缓冲区,用于接收inotify_event结构体数据。
  • len:缓冲区的长度,应足够容纳至少一个完整的事件结构及可能的文件名。

调用成功返回实际读取的字节数;失败返回-1。需要注意的是,一次read调用可能返回多个事件,应用程序需循环解析缓冲区中的数据。

5. inotify_rm_watch(int fd, int wd):移除监控项

当不再需要监控某个特定路径时,应调用此函数移除对应的监控项以释放内核资源。

  • fd:inotify实例的文件描述符。
  • wd:要移除的监控描述符,即inotify_add_watch成功时的返回值。

移除成功返回0,失败返回-1。

6. close(int fd):关闭监控实例

所有监控任务结束后,应使用close系统调用关闭inotify文件描述符。这是一个必要的资源清理步骤,会释放内核中与该实例相关的所有资源(包括所有未移除的监控项)。参数为待关闭的文件描述符fd,成功返回0,失败返回-1。

inotify_event 结构体:事件详情解析

inotify_event结构体是传递事件信息的数据载体,其定义如下:

struct inotify_event {
int wd; /* Watch descriptor */
uint32_t mask;/* Mask describing event */
uint32_t cookie;/* Unique cookie associating related events (for rename(2)) */
uint32_t len; /* Size of name field */
char name[];/* Optional null-terminated name */
};

各字段含义详解:

  • wd:触发此事件的监控描述符,用于关联到具体的监控路径。
  • mask:详细的事件类型掩码,标识具体发生了什么操作(如IN_CREATEIN_MODIFY)。
  • cookie:用于关联多个相关事件的唯一标识符。典型应用是文件重命名操作(rename),会生成一对分别对应旧名称移除和新名称创建的、具有相同cookie值的事件。
  • len:紧随结构体后的name字段的实际长度(字节数)。
  • name:一个柔性数组,存放触发事件的文件或目录的名称。注意:当监控的是一个目录时,此字段为目录内发生变化的子项名称;若监控的是单个文件,且事件不涉及路径名,则此字段可能为空(len为0)。

实战示例:监控目录文件变化

结合上述API,以下C语言示例程序演示了如何监控指定目录下的文件创建、删除和修改事件:

#include 
#include 
#include 
#include 
#include 

#define EVENT_SIZE( sizeof (struct inotify_event) )
#define BUF_LEN ( 1024 * ( EVENT_SIZE + 16 ) )

int main(int argc, char **argv) {
int length, i = 0;
int fd;
int wd;
char buffer[BUF_LEN];

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

wd = inotify_add_watch(fd, "/path/to/directory", IN_CREATE | IN_DELETE | IN_MODIFY);
if (wd < 0) {
perror("inotify_add_watch");
}

length = read(fd, buffer, BUF_LEN);
if (length < 0) {
perror("read");
}

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

(void) inotify_rm_watch(fd, wd);
(void) close(fd);
return 0;
}

使用时,请将代码中的/path/to/directory替换为实际需要监控的目录绝对路径,并可灵活调整inotify_add_watch中的事件掩码以监控不同事件类型。编译运行此程序,即可在终端实时查看目标目录下的文件变动日志。

来源:https://www.yisu.com/ask/37456015.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
CentOS下C++如何配置数据库连接

CentOS下C++如何配置数据库连接

在CentOS系统下配置C++程序连接数据库 在CentOS环境下,让C++程序成功“对话”数据库,其实是一套标准化的操作流程。整个过程清晰明了,咱们一步步来拆解。 1 安装数据库 第一步,自然是让数据库服务在系统上跑起来。以最常用的MySQL为例,一条命令就能搞定安装: sudo yum ins

时间:2026-05-02 18:25
C++在CentOS中如何进行安全配置

C++在CentOS中如何进行安全配置

C++在CentOS的安全配置清单 在CentOS上部署C++应用,安全配置绝非锦上添花,而是构建可靠服务的基石。下面这份清单,将从系统底层到应用代码层,为你梳理一套可落地的加固方案。 一 系统与账户安全基线 一切安全始于运行环境。打好系统基础,相当于为应用筑起第一道高墙。 保持系统与依赖库为最新:

时间:2026-05-02 18:25
CentOS如何配置C++图形界面开发环境

CentOS如何配置C++图形界面开发环境

在 CentOS 上配置 C++ 图形界面开发环境 想在 CentOS 上搞 C++ 图形界面开发?这事儿说难不难,但没找对路子,确实容易在环境配置上卡壳。别担心,下面这份从零开始的配置指南,能帮你快速搭好一个顺手的开发环境。 一 准备开发工具链 工欲善其事,必先利其器。第一步,就是把编译、构建这些

时间:2026-05-02 18:25
C++程序在CentOS如何进行性能调优

C++程序在CentOS如何进行性能调优

C++程序在 CentOS 的性能调优实践 性能调优这事儿,听起来复杂,其实核心就一条:用数据说话,按步骤推进。下面这套从基准到闭环的实践路径,能帮你把这件事做得有条不紊。 一 建立可复现的基准与监控 调优的第一步,不是直接上工具,而是先回答一个问题:我们到底要优化什么?没有清晰的量化目标,后续所有

时间:2026-05-02 18:25
Sublime如何一键格式化JSON?Sublime处理JSON数据的插件推荐

Sublime如何一键格式化JSON?Sublime处理JSON数据的插件推荐

Sublime如何一键格式化JSON?Sublime处理JSON数据的插件推荐 装完Package Control才能用任何JSON格式化插件 很多朋友第一次在 Sublime Text 4 里想格式化 JSON 时,都会遇到一个尴尬的情况:按下 Ctrl+Shift+P,搜索 JSON Reind

时间:2026-05-02 18:25
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程