2016-05-11 5 views
0

参考: How to monitor a folder with all subfolders and files inside?時間がかかるジョブをinotifyで処理するために2番目のスレッドが必要ですか?

拡張子が* .logのファイルのディレクトリを監視する必要があります。新しいファイルが作成または移動された場合は、そのファイルを処理します。各ファイルの処理には時間がかかります。

質問> inotifyイベントをリッスンして新しいファイル名をキューにプッシュし、別のスレッドを使用してキューを処理する必要がありますか?私が懸念しているのは、別のスレッドを使用しないと、いくつかの大きなファイルによって引き起こされた変更をinotifyが追跡できないということです。

私はsleepで問題をシミュレートしていますが、マルチスレッドコードなしで各ログファイルを処理しています。 inotifyは常に、ディレクトリ内の作成/移動されたすべてのファイルを訂正するように見えます。

私のシミュレーションです。

終了1: 私はアプリを実行し、メイン内のinotifyイベントを聴いています。 1つのログファイルを処理するたびに、私は10秒間スリープして、ファイル名をコンソールに出力します。

テルミンテ2: 時刻T1に複数のファイルを監視対象のディレクトリにコピーします。 アプリは前のファイルをすべて処理する前に、時刻T2に複数のファイルを移動します。 さらにT3の時間が経過すると、アプリが終了する前に複数のファイルをディレクトリにコピーします。

観測: アプリケーションは、期待どおりにすべてのログファイルを処理しました。

質問>これはinotifyの動作ですか、今朝は運が良かったですか? 換言すれば、上記のようなシミュレーションの場合には、未処理のイベントをキャッシュにインテイトしますか? FYI

#define EVENT_SIZE (sizeof (struct inotify_event)) 
#define BUFFER_LEN (1024 * (EVENT_SIZE + NAME_MAX + 1)) 

wd = inotify_add_watch(fd, root.string().c_str(), IN_CREATE | IN_MOVED_TO); 

while (true) 
{ 
    length = read(fd, buffer, BUFFER_LEN); 

    for (int i = 0; i < length;) 
    { 
     const inotify_event *ptrEvent = reinterpret_cast<inotify_event *>(&buffer[i]); 
     ... // processing the event 
     sleep(10); // to simulate the long work 
     i += INO_EVENT_SIZE + ptrEvent->len; 
    } 
} 
+0

inotify_add_watch()が返すfdは 'select()'で動作しますか? –

+0

@RichardHodges、これをチェックするhttp://stackoverflow.com/questions/37125002/why-perform-selective-read-on-the-inotify-instance-using-select-call – q0987

答えて

0

はのは、思考実験をやってみましょう:私が使用したコードスニペット。明らかに、あなたが読むことができるイベントを備えたキューがあります。しかし、あなたがそれらを読まないとしましょう。キューのサイズがバインドされていない場合、メモリが不足するため、スターターではありません。キューがバインドされている場合は、ある時点でイベントをドロップするか、または前記イベントを生成するBLOCK操作を開始する必要があります。後者は明らかに初心者ではありません。つまり、inotifyウォッチャーのプロセスが何かを待っていて、何も読んでいないため、fs操作をブロックしたくないのです。

しかし、最も重要なことは、まずinotifyを使用したくないということです。ここの事業全体が誤って設計されているように見えます。あなたが望んでいるのは、ファイル名が変更される1つのディレクトリです。そのため、ファイルが表示されたときに、読み込みが安全です。次に、これが何であるかに応じて、SIGUSR1などを取得してディレクトリ処理をトリガーするか、正確なファイル名でUNIXソケット経由でリクエストを取得することができます。

問題のディレクトリには、未処理のファイルのみが含まれている必要があります。

関連する問題