書き込みが開始または完了すると、inotifyは通知をトリガーしますか?

書き込みが開始または完了すると、inotifyは通知をトリガーしますか?

ext3ファイルシステムの通常のファイルを介して通信する2つのプロセス、リーダーとライターを想像してみてください。 ReaderにはIN_MODIFYファイルの監視があります。 Writerは1回の呼び出しでファイルに1000バイトを書き込みますwrite()。リーダーはinotifyイベントを受け取り、fstatファイルを呼び出します。読者は何を見るか。

  1. st_size読者が自分の文書に対する報酬として少なくとも1,000ドルを受け取ることができることは保証されていますか?私の実験によるとそうではありません。

  2. Readerが実際に1000バイトを読むことができるという保証はありますかread()

これは、I / Oバインディングの重いボックスで発生します。たとえば、sar約1秒の待ち時間が表示されます。私の場合、Readerは実際にinotifyイベントを受け取ってから10秒待ってから呼び出しましたが、stat結果が小さすぎました。

私が望むのは、ファイルが準備されるまでinotifyイベントが送出されないことです。実際に何が起こるのかは、write()Writerからの呼び出し中にinotifyイベントが発生し、データが準備されている限り、システムの他のプロセスで実際にデータを使用できることです。この場合、10秒では不十分です。

私はカーネルが実際に私が推測した方法でinotifyを実装していることを確認するために探しているようです。また、この動作を変更するオプションはありますか?

最後に、この動作を考えると、inotifyのポイントは何ですか?いずれにせよ、イベントを受け取った後は、データが実際に利用可能になるまでのみファイル/ディレクトリをポーリングできます。これを続けてinotifyを忘れることもできます。

***編集する**** まあ、よくあるように、私が見た行動は本当に意味があり、今は私が実際に何をしていたのか理解しています。 ^_^

実際にファイルがあるディレクトリのIN_CREATEイベントに応答しています。だから私は実際にファイルの生成に応答してファイルをstat()しています。 IN_MODIFYイベントは必ずしも必要ではありませんが、後で到着する可能性があります。

IN_CREATEイベントが受信されると、ファイル自体のIN_MODIFYを購読し、IN_MODIFYイベントが受信されるまで実際にファイルを読み取ろうとしないようにコードを変更します。私はそこに小さなウィンドウがあり、ファイルへの書き込みを見逃す可能性があることを知っていますが、最悪の場合、ファイルは最大時間(秒)後に閉じられるので、これは私のアプリケーションに許可されています。

答え1

私が見るものからカーネルソースコード、inotifyは書き込みが完了した後にのみ開始されます(つまり、推測が間違っています)。通知がトリガされると、sys_writeシステムコールを実装する関数では2つのことが発生しますwrite。一部のスケジューラパラメータが設定され、ファイル記述子の場所が更新されます。このコードは2.6.14。通知が実行されると、ファイルのサイズはすでに変更されています。

間違っている可能性があることを確認してください。

  • おそらく、読者は以前に書かれた古い通知を受け取っているでしょう。
  • 読者が電話をかけてstat再び電話をreadしたり、その逆の場合、その間に何かが発生する可能性があります。ファイルに引き続き追加する場合は、最初に呼び出すとそのstat部分まで読み取ることができますが、readまだinotify通知を受け取っていない場合でも、リーダーが呼び出されるまでより多くのデータが記録されている可能性があります。
  • ライターが呼び出されたとしても、writeカーネルが要求した文字数だけ書き込むという意味ではありません。アトミック書き込みのサイズが保証されるケースはほとんどありません。ただし、各write呼び出しは原子性が保証されます。ある時点では、データがまだ記録されていないと突然発生します。Nバイトがどこに書き込まれたかN呼び出しの戻り値ですwrite。部分的に作成されたファイルを観察すると、返されたファイルが対応するサイズwriteパラメータよりも小さいことを意味します。

何が起こっているのかを調べるのに役立つツールは次のとおりです。

  • strace -tt
  • 監査サブシステム

関連情報