inotify 是 Linux 内核提供的一套文件系统事件监控机制,用大白话说,就是让应用程序能够实时“盯住”某个文件或目录,一有风吹草动——比如文件被创建、被删除、内容被修改——立刻就能收到通知。它给开发者准备了一组简洁的 API,在用户空间就能轻松调用。

那具体怎么上手呢?下面几个核心接口就是玩转 inotify 的关键:
-
初始化 inotify 实例:先调用
inotify_init(),它会创建一个新的inotify实例,返回一个文件描述符。后续所有的监控操作都要通过这个文件描述符来驱动——可以把它理解为整个监控系统的“遥控器”。int fd = inotify_init(); if (fd < 0) { // 错误处理 } -
添加监控项:有了“遥控器”之后,用
inotify_add_watch()告诉内核你想盯哪个文件或目录,以及关心哪些事件类型。比如下面这个例子,监控路径下文件的创建、删除和修改:int wd = inotify_add_watch(fd, "/path/to/file_or_directory", IN_CREATE | IN_DELETE | IN_MODIFY); if (wd < 0) { // 错误处理 }这里返回的
wd是一个监控描述符,后续读取事件时会用到它来区分是哪个监控项产生的通知。 -
读取事件:监控设置好之后,通过
read()从文件描述符中读取事件数据。每次read()会返回一个或多个inotify_event结构体,里面包含了发生的事件信息。char buffer[4096]; ssize_t length = read(fd, buffer, sizeof(buffer)); if (length < 0) { // 错误处理 } // 解析 buffer 中的事件inotify_event结构体包含几个关键字段:len:事件数据的长度mask:具体发生了哪种事件类型cookie:用于关联相关事件(比如文件的移动操作)name:发生变化的文件或目录名称(如果有的话)
-
移除监控:如果某个文件或目录不再需要监控,调用
inotify_rm_watch()把它摘掉就行:int ret = inotify_rm_watch(fd, wd); if (ret < 0) { // 错误处理 } -
关闭 inotify 实例:应用结束时,别忘了用
close()关闭文件描述符,释放内核资源:close(fd);
这几步就是 inotify 的基本用法。当然,真实场景下不会只跑一次就完事——通常需要一个循环持续读取事件,并且要处理好各种边界情况:比如监控项太多、事件爆发频率太高,都需要更精细地管理 inotify 实例和事件队列。如果你打算在生产环境里用它,建议提前踩一遍这些坑。