inotify を使用して、ディレクトリに監視を追加することにより、ディレクトリに作成された新しいファイルのディレクトリを監視します。
fd = inotify_init();
wd = inotify_add_watch(fd, "filename_with_path", IN_CLOSE_WRITE);
inotify_add_watch(fd, directory_name, IN_CLOSE_WRITE);
const int event_size = sizeof(struct inotify_event);
const int buf_len = 1024 * (event_size + FILENAME_MAX);
while(true) {
char buf[buf_len];
int no_of_events, count = 0;
no_of_events = read(fd, buf, buf_len);
while(count < no_of_events) {
struct inotify_event *event = (struct inotify_event *) &buf[count];
if (event->len) {
if (event->mask & IN_CLOSE_WRITE) {
if (!(event->mask & IN_ISDIR)) {
//It's here multiple times
}
}
}
count += event_size + event->len;
}
ファイルをディレクトリに scp すると、これが無限にループします。このコードの問題は何ですか? 同じイベント名とイベント マスクも表示されます。つまり、同じ無限回のイベントであることを示しています。
break ステートメントはありません。イベントが見つかったら、それを出力して read() で別のイベントを待ち続けます。これはブロッキング コールである必要があります。代わりに、無限ループを開始します。つまり、 read はそれをブロックしませんが、1 つのファイルに対して同じ値を無限に返します。
この操作全体は、個別の boost::thread で実行されます。
編集:
申し訳ありません。私が得ていたエラーは、inotify が原因ではなく、最初は検出するのが難しい sqlite が原因でした。私はここで銃を飛ばしたと思います。さらに調査した結果、inotify が完全に機能することがわかりました。しかし、エラーは実際には sqlite コマンドから発生しました:ATTACH
そのコマンドは、想定されていたように、すぐに使用できるコマンドではありませんでした。ファイルにメタデータを書き込んでいました。そのため、inotify は何度も通知を受け取ります。それらが非常に高速に発生したため、アプリケーションが台無しになりました。その理由を理解するために、最終的にコードを分割する必要がありました。
みんな、ありがとう。