Unixには「コピー」というものはありません。ファイルをコピーするための最も高度なシステムコール(sendfileとcopy_file_range)でさえ、中間バッファを使用して、2つの独立したファイル間でデータを複製することになります。
しかし、いくつかの推測を使用して、確実な程度のファイルコピーを特定できます。
と仮定、
- 2つのファイルが開いていること:AおよびB(特定の順序なし)
- AはBが(IN_MODIFY)
- Aに書き込まれ
- (IN_ACCESS)から読み出されます(IN_CLOSE_NOWRITEによって識別されるように)
- Bが書き込み可能にオープンされている(IN_CLOSE_WRITEによって識別される)
- AとBとは、同一のデータサイズ(stat.st_size)上記配列がちょうど共通のヒューリスティックではなく、厳密なルールであることその後
注意を有します。 (例えば、ソースファイルを開く前に、ターゲットファイルを切り捨てるか、INCOMODYにするなど)他のイベントがあるかもしれません。コピー処理は、既存のターゲットファイルをリンク解除し、コピー専用の新しいファイルを作成することがあります。この場合、新しいファイルはタイムリーにである必要があります。サブスクリプションレースのためにいくつかの(またはすべての)イベントが見逃されることがあります。サブスクリプションレースは、設計上完全に検出されません。
また、インテイファント・キュー・オーバーフロー(IN_Q_OVERFLOW)のためにイベントが大量に欠落することがあります。
Inotifyはmmap-edファイルでメモリ内のアクションを検出できません。また、mmapはファイルのコピーによく使用されます。したがって、ステップ2と3全体が欠落している可能性があります。
対象となるファイルシステム(および制御されていない環境でinotifyを使用する予定があるかどうか)を指定していないが、一部のファイルシステムがinotifyをサポートしていない可能性があることに注意してください(FUSEベースおよびネットワークファイルシステムは特に問題があります)。これは、FUSEの場合の特定のファイルシステムとカーネルバージョンに依存します。
ハードリンクの作成は厳密にはコピーとは限りませんが、その状況に似た死後のパターン(同じサイズと同じ見た目の内容を持つ2つのファイル)が生成される可能性があります。そのため上記の理由の
あなたは大きな見返りを期待していない限り、inotifyでコピーを識別することは、雑用のあまりです。静的解析を使用してコピーを識別することから始めることを検討してください。なぜなら、とにかくinotifyを使用してフォールバックすることがあるからです。
お返事ありがとうございます。非常に役に立ちます。 –