ディレクトリのプロセスによって生成され、作成されたファイルを見たいです。inotifywait
ツールにアクセスできないため、Inotifyライブラリ呼び出しのみを使用してください。まず、IN_CREATE
ファイルが作成されたかどうかを監視します。興味のあるファイルが作成されたら、CLOSE_WRITE
監視するイベントを追加します。このスキームは、マイハンドラがイベントを処理するときにファイルがすでに作成され閉じられていて、IN_CREATE
その書き込みイベントを見逃すことを除いて機能します。
この状況を解決するための最良の方法は何ですか?stat
を使用する機能を使用しようとしていますがatim
、mtim
問題があるかどうかはわかりません。たとえば、現在のタイムスタンプがst_ctimより大きいかどうか、st_ctimがst_atimより大きいかどうかを確認します。これら2つの条件は、現在の時刻より前にファイルの状態が変更(アクセスおよび変更)されたことを示します。
答え1
まず、「関心のあるファイルが作成されたら、監視するCLOSE_WRITEイベントを入力します」という言葉が何を意味するのかわかりません。
互いに切り替えることIN_CREATE
なく、同じアンケートで監視できます。IN_CLOSE_WRITE
イベントが発生すると、inotify_event
inotifyハンドラ(から返されるinotify_init()
)から構造を読み取ることができ、そのフィールドはmask
実際にどのイベントが発生したかを示します。
第二に、inotifyイベントが欠落している可能性があります。文書に明確に記載されています。考えられる問題の完全なリストは、の「制限と警告」のタイトルの下にリストされていますinotify(7)
。
「キューオーバーフロー」状況が発生したようです。はい、これは実際の状況であり、使用量の多いシステムで頻繁に発生します。残念ながら、これは修正できません。ただ解決してください。これを解決するにはいくつかの方法がありますが、必要なものがよりよく理解されていない場合は、具体的に説明できません。
通常、更新後すぐに更新されたファイルを表示するには、ファイルscandir()
ごとに並べ替えるか、ファイルディレクトリをフィルタリングしますmtime
。この場合、inotifyは「ディレクトリで発生した問題」のウェイクアップ呼び出しとして機能し、受信するとすべての更新を確認する長期実行プロセスに入ります。終わったらベッドで寝てくださいpoll()
。この場合、poll()
あるイベントの終わりと次のイベントの開始の間に発生するイベントは無視されます。ただし、すべてのアップデートが一括で受信されます。