如何使用inotify?

我想在Linux上使用inotify机制。 我希望我的应用程序知道文件aaa何时更改。 你可以给我一个样本如何做到这一点?

Solutions Collecting From Web of "如何使用inotify?"

  • 文档(从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_init()产生的描述符,调用read()来等待警报。 假设一个典型的文件描述符,应用程序阻塞等待接收事件,这些事件被表示为流中的数据。 从inotify_init()得到的文件描述符上的公共close()删除并释放所有活动监视以及与inotify实例关联的所有内存。 (典型的引用计数警告也适用于这里,所有与实例相关的文件描述符必须在手表被内存消耗之前关闭,并且被释放。)

  • 一个例子(从coreel 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上添加一个监视器,以进行任何修改,文件创建或文件删除。

以下是如何使用inotify观看“aaa”的片段。 请注意,我没有测试过这个,我甚至没有编译它! 你将需要添加错误检查。

您也可以使用inotfd上的poll / select来代替使用阻塞式读取。

 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 */ 

由于最初的问题似乎提到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; }