讲师中心 微信公众号
AI工具推荐 视频效率加速

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

老宇吖_3483

老宇吖_3483

发布时间:2026-03-25 15:31:31

|

573人浏览过

|

来源于php中文网

原创

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。

立即学习“C++免费学习笔记(深入)”;

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

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

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

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

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

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++

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

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

相关专题

更多
cookie
cookie

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

11139

2023.06.30

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

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

966

2023.11.23

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

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

744

2024.02.23

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

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

1826

2025.08.19

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

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

4174

2025.06.09

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

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

4311

2025.07.04

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

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

470

2025.09.05

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

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

323

2025.11.16

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn