c++ - 除了使用 inotify 之外如何递归监视目录

标签 c++ linux

我想制作一个 C++ 应用程序来监视其目录或其子目录中的文件更改。我知道 inotify 可以监视单级目录更改,我需要为每个子目录手动添加一个监视以检测子目录中的更改。 我需要知道除了 inotify 之外是否还有任何其他方法可以递归监视 Linux 中目录中的更改。

最佳答案

要递归地监控一个目录,你必须:

  1. 使用 inotify_init(2)inotify_init2(2) 创建一个 inotify(7) 对象。
  2. 在您的目录上递归下降,使用inotify_add_watch(2) 获取您希望收到通知的所有节点(在扫描之前为目录本身添加监视,否则您将丢失事件 -- -se 下面)。
  3. 等待事件发生在您收到的 inotify 描述符上。

考虑到创建目录会强制您重新扫描目录内容,因为您可以在监视目录上获得一个新子目录的事件,但是在您有机会为监视添加监视之前可以在其上创建文件最近创建的目录,因此您不会被告知该文件已创建。

出于最后一个原因,您需要考虑将所有内容放入一个子例程中,并在每次创建新目录时调用它。通过这种方式,您可能会扫描将收到创建事件的文件,但另一方面您可能会丢失事件。

此外,您必须准备好自己进行完整的树重新扫描,以防您丢失一些事件(在完整的队列溢出中)。

相信我,这比传统方式要有效得多。并且您可以在重新扫描之间绕过短暂的文件。

这个问题没有递归解决方案的原因已在上面的一条评论中指出(您需要内核为您进行搜索,即使您对此不感兴趣)

关于c++ - 除了使用 inotify 之外如何递归监视目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25524995/

相关文章:

c++ - 在构造函数中初始化静态函数指针

c++ - Android 系统模块不会在构建时生成输出

c++ - getline 只取一部分信息

c++ - c++中bash(system-> wget)命令的问题

c++ - 如何在 linux 中获取本地代码页?

c++ - 为什么 Go 套接字比 C++ 套接字慢?

c++ - log4cpp: Linux 找不到 lib 文件

linux - 使用命令行重定向输入和输出

C++ 在某个键按下直至其按下时录制音频

PHP 和 mysql 在 Linux 中与 apache tomcat 6 集成