GNU/Linux >> Linux の 問題 >  >> Linux

inotify を使用する適切な方法は何ですか?

以下は、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 */

コマンドライン アプリケーションだけが必要な場合は、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.

更新 :注意して使用し、コメントを参照してください。


ここのいくつかのコメントで指摘されているように、最初の質問はタグとして Qt に言及しているように見えるので、検索エンジンがあなたをここに導いたのかもしれません。

Qt でそれを行う方法を知りたい場合は、Qt バージョンの http://doc.qt.io/qt-5/qfilesystemwatcher.html を参照してください。 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;
}

  • ドキュメンテーション (Monitor file system activity withinotify から)

inotify C API

inotify あらゆる種類のファイル システム モニターを構築するための 3 つのシステム コールを提供します。

  • inotify_init() inotify のインスタンスを作成します カーネルのサブシステムであり、成功した場合と -1 の場合にファイル記述子を返します 失敗したとき。他のシステム コールと同様に、inotify_init() の場合 失敗、errno をチェック 診断用
  • inotify_add_watch() は、その名前が示すように、時計を追加します .各ウォッチは、パス名と関連するイベントのリストを提供する必要があります。各イベントは IN_MODIFY などの定数で指定されます。 .複数のイベントを監視するには、単純に論理 OR (C のパイプ (|) 演算子) を各イベントの間に使用します。 inotify_add_watch() の場合 成功すると、呼び出しは登録されたウォッチの一意の識別子を返します。それ以外の場合は、-1 を返します .識別子を使用して、関連する時計を変更または削除します。
  • inotify_rm_watch() 時計を削除します。

read()close() システムコールも必要です。 inotify_init() によって生成された記述子を考える 、 read() を呼び出します アラートを待ちます。典型的なファイル記述子を仮定すると、アプリケーションは、ストリーム内のデータとして表現されるイベントの受信を保留してブロックします。 inotify_init() から生成されたファイル記述子の一般的な close() すべてのアクティブなウォッチと inotify インスタンスに関連付けられたすべてのメモリを削除して解放します。 (典型的な参照カウントの警告がここにも適用されます。インスタンスに関連付けられたすべてのファイル記述子は、監視および inotify によって消費されたメモリが解放される前に閉じる必要があります。)

  • 例 (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 に監視を追加します。


Linux
  1. LinuxでTarコマンドを使用する方法

  2. ファイルの行をコマンドの引数として使用するにはどうすればよいですか?

  3. Bashでの$#の使用は何ですか

  1. systemd で OnFailure を使用する適切な方法

  2. useradd コマンドでオプション -o を使用するとは何ですか?

  3. ユーザーにログ ファイルへの読み取りアクセスを許可する最も安全な方法は何ですか?

  1. Linuxでの.bashrcファイルの目的は何ですか

  2. sedにタブを挿入する正しい方法は何ですか?

  3. `.bashrc` などの 'rc' は何を意味していますか?