使用 inotify 的正确方法是什么?
- 2024-11-07 08:55:00
- admin 原创
- 28
问题描述:
我想inotify
在 Linux 上使用该机制。我希望我的应用程序知道文件何时aaa
被更改。您能给我提供一个如何做到这一点的示例吗?
解决方案 1:
文档(来自使用 inotify 监控文件系统活动)
inotify
C API
inotify
提供三个系统调用来构建各种文件系统监视器:
inotify_init()
在内核中创建子系统的实例inotify
,并在成功和失败时返回文件描述符-1
。与其他系统调用一样,如果inotify_init()
失败,则检查errno
诊断。inotify_add_watch()
顾名思义,添加了一个监视。每个监视必须提供路径名和相关事件列表,其中每个事件由常量指定,例如IN_MODIFY
。要监视多个事件,只需在每个事件之间使用逻辑或(C 中的管道 (|) 运算符)。如果inotify_add_watch()
成功,调用将返回已注册监视的唯一标识符;否则,它将返回-1
。使用标识符可以更改或删除关联的监视。inotify_rm_watch()
移除手表。
还需要read()
和系统调用。给定由 生成的描述符,调用以等待警报。假设一个典型的文件描述符,应用程序将阻塞以等待接收事件,这些事件以流中的数据表示。由 生成的文件描述符上的通用 close()删除并释放所有活动监视以及与 inotify 实例关联的所有内存。(典型的引用计数警告也适用于此。必须先关闭与实例关联的所有文件描述符,然后才能释放监视和 inotify 消耗的内存。)close()
`inotify_init()read()
inotify_init()`
一个例子(来自Kernel Korner - inotify 简介)
#include "inotify.h" #include "inotify-syscalls.h" int wd; wd = inotify_add_watch (fd, "/home/rlove/Desktop", IN_MODIFY | IN_CREATE | IN_DELETE); if (wd < 0) perror ("inotify_add_watch");
此示例在目录 /home/rlove/Desktop 上添加一个监视,以监视任何修改、文件创建或文件删除。
解决方案 2:
下面是如何使用 inotify 监视“aaa”的片段。请注意,我还没有测试过,我甚至还没有编译它!您需要为其添加错误检查。
您还可以在 inotfd 上使用轮询/选择,而不是使用阻塞读取。
const char *filename = "aaa";
int inotfd = inotify_init();
int watch_desc = inotify_add_watch(inotfd, filename, IN_MODIFY);
size_t bufsiz = sizeof(struct inotify_event) + PATH_MAX + 1;
struct inotify_event* event = malloc(bufsiz);
/* wait for an event to occur */
read(inotfd, event, bufsiz);
/* process event struct here */
解决方案 3:
如果你需要的只是一个命令行应用程序,那么有一个名为inotifywait
使用以下方式监视文件的应用程序:inotify
从 1 号航站楼
# touch cheese
# while inotifywait -e modify cheese; do
> echo someone touched my cheese
> done
从 2 号航站楼
echo lol >> cheese
这是 1 号航站楼的景象
Setting up watches.
Watches established.
cheese MODIFY
someone touched my cheese
Setting up watches.
Watches established.
更新:谨慎使用并查看评论。
解决方案 4:
由于最初的问题似乎提到了 Qt 作为标签,正如这里的几条评论所指出的那样,搜索引擎可能会引导您到这里。
如果有人想知道如何使用 Qt 来实现这一点,请参阅
http://doc.qt.io/qt-5/qfilesystemwatcher.html了解 Qt 版本。在 Linux 上,它使用 Inotify 的一个子集,如果可用,请参阅 Qt 页面上的说明了解详情。
基本上所需的代码如下所示:
在 mainwindow.h 中添加:
QFileSystemWatcher * watcher;
private slots:
void directoryChanged(const QString & path);
void fileChanged(const QString & path);
对于 mainwindow.cpp:
#include <QFileInfo>
#include <QFileSystemWatcher>
watcher = new QFileSystemWatcher(this);
connect(watcher, SIGNAL(fileChanged(const QString &)), this, SLOT(fileChanged(const QString &)));
connect(watcher, SIGNAL(directoryChanged(const QString &)), this, SLOT(directoryChanged(const QString &)));
watcher->addPath("/tmp/"); // watch directory
watcher->addPath("/tmp/a.file"); // watch file
还在 mainwindow.cpp 中添加插槽,如果注意到文件/目录更改,则会调用这些插槽:
void MainWindow::directoryChanged(const QString & path) {
qDebug() << path;
}
void MainWindow::fileChanged(const QString & path) {
qDebug() << path;
}
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件