4

ディレクトリ内のすべてのファイルに対してコマンドを呼び出し、そのディレクトリ内に作成されるすべてのファイルに対してそのコマンドを呼び出すように監視を設定するとします。私が行った場合:

while( ( sdi = readdir( d )) != NULL ) { ... }
closedir( d );
/* Files created here will be missed */
inotify_add_watch( ... );

そうすると、一部のファイルが失われる可能性があります。readdir()の前にinotify_add_watch()を呼び出すと、ファイルが2回動作する可能性があります(2回動作しないようにするには、かなりのインフラストラクチャが必要であり、エッジケースの処理が難しいようです)。readdirループ中に処理されたすべてのファイルの名前を記録し、それらをinotify_event構造で返された名前と比較する必要を回避する簡単な方法はありますか?次の方法で、必要な比較の量を最小限に抑えることができます。

while( ( sdi = readdir( d )) != NULL ) { ... }
inotify_add_watch( ... );
while( ( sdi = readdir( d )) != NULL ) { /* record name */ ... }
closedir( d );

そして通常、2番目のreaddir()ループは何もしませんが、これは悪いハックのように感じます。

4

1 に答える 1

3

あなたは単にできません。ハッキングすればするほど、より多くの競合状態が発生します。

実際に機能する最も簡単な解決策は、を使用する前に時計を設定しopendir()、すでに使用されている名前(またはそのハッシュ)のリスト(セット)を保持することです。

しかし、これも完璧ではありません。ユーザーはファイルをテキストエディタで開くことができます。あなたがそれを修正すると、ユーザーはそれを保存し、ディレクトリには未修正のファイルが含まれていますが、それはあなたのリストにあります。

最良の方法は、プログラムが実際に使用されているファイルをその内容によって区別できるようにすることです。つまり、watchを設定し、結果に対してコマンドをreaddir()呼び出してから、inotifyの結果に対してそれを呼び出し、ファイルが既に正常であるかどうかをコマンド自体に通知します。

于 2011-08-23T08:27:37.443 に答える