参考: 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;
}
}
inotify_add_watch()が返すfdは 'select()'で動作しますか? –
@RichardHodges、これをチェックするhttp://stackoverflow.com/questions/37125002/why-perform-selective-read-on-the-inotify-instance-using-select-call – q0987