私のプログラムは、呼び出しの間にディレクトリにファイルが追加されたかどうかを効率的に検出できるようにしたいと思います。分析によってユーザー入力がブロックされる可能性があるため(これはフィッシュシェルに適用されます)、ディレクトリが大きい場合でもできるだけ早く実行したいと思います。
私は標準のUnixに限定されているので、inotifyにアクセスできません。
私が考えた1つの方法は、ウォッチディレクトリのファイルリストをハッシュセットに保存して分析するときにディレクトリ全体を読み、ハッシュセットにないものがあるかどうかを確認することです。別のアプローチは、各ファイルをlstatし、生成時間を比較することです。
とにかく私のユースケースでは、2つのことを行う必要があります。
- 各項目に対して readdir を呼び出します。
- 各項目に対してlstatを呼び出します。(2番目のソリューションを使用する場合)
私の質問は次のとおりですreaddirとlstatをバッチ処理する効率的な方法はありますか?
私考えるreaddirはシステムコールではなくSYS_getdentsシステムコールを囲むラッパーなので、おそらくいくつかのバッファリングを実行しますが、どのくらいですか?どのくらい効率的ですか?
そしてlstatはシステムコールAFAIKをラップします。同時に、多くのファイルをチェックし、各ファイルに対してコンテキスト切り替え呼び出しを支払いたくない場合は、より効率的なバージョンがありますか?
答え1
はい、他の方法があります - getdents()
。ほぼ同じように動作しますreaddir()
が、複数の項目を一度に処理します。したがって、構造体の配列にメモリを割り当ててlinux_dirent
それgetdents()
を埋めようとすることができます。
これはPOSIX機能ではないので、利用できない場合inotify
(本当にですか??)おそらくアクセス権がないものですgetdents()
。
しかし、結局、これは、getdents()
同様の構造の配列を手動で繰り返すことと変わらない。ラッパーではないため、パッシブループよりも効率的ですが(エラーが発生する可能性は低い)、効率性はそれほど興味深いものではありません。readdir()
dirent
getdents()
readdir()
新しいファイルがディレクトリに表示されるか削除されるかを知ることが目標である場合は、ディレクトリlstat()
自体について学ぶことができます。mtime
ファイルが作成/削除されると、ディレクトリのディレクトリが変更されます。ファイル修正はファイル自体に属し、ディレクトリ時間には反映されません。