【发布时间】:2014-12-10 23:05:05
【问题描述】:
我想异步监控文件的任何更改。也就是说,当文件被修改/删除时,我想在我的程序中进行回调(可能来自内核)。该文件只是一个纯文本文件。我知道可以使用轮询机制来做到这一点,但我正在寻找一种基于事件的解决方案。我阅读了有关 inotify 的信息,但看起来它需要修补我的内核。
如果解决方案符合 POSIX 标准,那就更好了。
【问题讨论】:
标签: c++ file unix filesystems posix
我想异步监控文件的任何更改。也就是说,当文件被修改/删除时,我想在我的程序中进行回调(可能来自内核)。该文件只是一个纯文本文件。我知道可以使用轮询机制来做到这一点,但我正在寻找一种基于事件的解决方案。我阅读了有关 inotify 的信息,但看起来它需要修补我的内核。
如果解决方案符合 POSIX 标准,那就更好了。
【问题讨论】:
标签: c++ file unix filesystems posix
Inotify 早在 2005 年就被合并到 Linux 内核中,所以除非您使用的是一个非常旧的系统,否则您应该可以直接使用它。
我认为不存在符合 POSIX 标准的解决方案。 Mac OS X 有FSEvents。
还要检查 man page 的 inotify。
编辑:
不知道您的约束和/或要求,但是如果您使用 Glib(C++ 绑定是 glibmm)还有 GFileMonitor 和 QFileSystemWatcher 您使用 Qt。这些可能更适合跨平台。
【讨论】:
inotify 等待文件出现的小例子,如果有帮助的话 - lazarenko.me/tips-and-tricks/… 它可以很容易地调整以监视文件更改。
1)
编写一个设备驱动程序来创建一个名为 /dev/special_file 的文件。
将纯文本文件符号链接到 /dev/special 文件
拦截低级读/写操作以修改名为 /path/to/text.txt 的真实文本文件,然后通过信号或某种类型的进程间通信生成回调到您想要的任何进程。
2)
让进程打开您的文本文件,然后坐等。使用 select() 检测该文件何时被修改,然后执行回调例程。
【讨论】: