c++如何监控目录中文件的增删改_inotify机制实战【进阶】

老宇吖_3483

老宇吖_3483

2026-03-25

573人浏览

原创

inotify_add_watch返回-1且errno=enospc是因系统限制每个用户inotify实例总数,默认128,需调大/proc/sys/fs/inotify/max_user_instances并确保及时调用inotify_rm_watch或close。

c++如何监控目录中文件的增删改_inotify机制实战【进阶】

inotify_add_watch 返回 -1 且 errno=ENOSPC 怎么办

这是 inotify 最常卡住人的第一道坎:监控句柄数超限,不是代码写错了,是系统限制了每个用户能创建的 inotify 实例总数。

典型现象是反复调用 inotify_add_watch 突然失败,errno 打印出来是 ENOSPC(注意不是磁盘空间满,而是 inotify 资源耗尽)。

  • 查当前限制:cat /proc/sys/fs/inotify/max_user_instances,默认常为 128
  • 临时提高(需 root):sudo sysctl fs.inotify.max_user_instances=512
  • 永久生效:往 /etc/sysctl.conf 加一行 fs.inotify.max_user_instances = 512
  • 更关键的是——别漏掉 inotify_rm_watch 或 close(inotify_fd),尤其在异常路径或子目录递归监控时容易忘记清理

监控子目录需要递归调用 inotify_add_watch 吗

需要,inotify 本身不支持递归监控。你对父目录加 watch,只会收到该目录下直接子项的事件(比如新建一个子目录),但不会自动监控那个子目录内部的变化。

所以“监控整个目录树”的逻辑必须自己实现:监听到 IN_CREATE | IN_ISDIR 事件后,立刻对新出现的子目录再调用一次 inotify_add_watch。

  • 注意判断 event->mask & IN_ISDIR 再决定是否递归添加,否则会把文件也当目录去 open 失败
  • 避免重复添加:用 std::map 或 std::set 记录已监控的路径,防止同一目录被多次 watch 导致资源浪费
  • 删除子目录时记得同步调用 inotify_rm_watch,否则残留 watch 句柄会持续占用限额

read(inotify_fd, buf, len) 返回值小于 sizeof(struct inotify_event) 怎么处理

这说明内核返回了不完整的事件结构体,常见于缓冲区太小或事件爆发式涌入。不能直接按固定偏移解析,否则会读错字段甚至越界。

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载

inotify_event 是变长结构体:len 字段表示实际事件名长度,整个事件大小是 sizeof(struct inotify_event) + event->len。

  • 每次 read 后必须用 event->len 计算下一个事件起始位置,不能硬写 event + 1
  • 缓冲区大小建议至少设为 4096(一页),太小会导致频繁截断;但也不要盲目设极大值,read 是阻塞的,大缓冲可能拖慢响应
  • 遇到 read 返回值为 0?那是 inotify fd 被 close 了,通常意味着上层主动释放或进程异常退出

监听 IN_MOVED_TO 但收不到重命名事件?

重命名(mv)操作在 inotify 中拆成两个事件:IN_MOVED_FROM 和 IN_MOVED_TO,且共用同一个 cookie 值。只监听其中一个,就会漏掉关联性。

如果你只关心“文件被重命名了”,必须同时监听这两个 mask,并靠 cookie 匹配成对事件。

  • 别用 IN_MOVE 宏——它只是 IN_MOVED_FROM | IN_MOVED_TO 的简写,实际注册时仍要显式包含两者
  • cookie 为 0 表示单向移动(如跨文件系统 mv,本质是 copy+unlink),此时只会有 IN_MOVED_TO 或只有 IN_MOVED_FROM
  • 注意:IN_MOVED_TO 的 name 字段是目标文件名,但若重命名发生在被监控目录之外(比如从外面 mv 进来),name 才有效;否则可能为空

真正难的不是怎么注册 watch,而是怎么在大量事件涌入时不丢、不错、不重复、不泄漏句柄——尤其是程序长期运行时,inotify 的资源生命周期管理比事件解析更易出问题。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

2023.06.30

11179

10

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.23

986

5

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

744

5

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

2025.08.19

1826

14

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

2025.06.09

4194

18

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

2025.07.04

4331

25

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

470

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

323

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

493

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习