問題へのアプローチが間違っています。読んでいる間にファイルが変更されないようにしたいのですが、オペレーティングシステムのサポートなしではそれを行うことはできません。マルチユーザー システムで期待できる最善の方法は、アーカイブ メタデータの一貫性を保つことです。
たとえば、アーカイブ ディレクトリを作成している場合は、アーカイブに格納されているバイト数がディレクトリと一致していることを確認してください。ファイルシステムを読み取る前後にファイルの内容をチェックサムし、それをアーカイブに書き込んだ内容と比較して、おそらく「不一致」としてフラグを立てることができます。
何を達成しようとしていますか?
コメントに応じて追加:
logrotate
これを一貫して処理する方法についてのアイデアを盗むために見てください。ファイルの名前を変更すると、現在ファイルを書き込んでいるプロセスが壊れてしまうのではないかと心配している場合は、以下をご覧くださいman 2 rename
。
rename() はファイルの名前を変更し、必要に応じてディレクトリ間でファイルを移動します。ファイルへのその他のハード リンク (link(2) を使用して作成されたもの) は影響を受けません。oldpath のオープン ファイル記述子も影響を受けません。
newpath がすでに存在する場合、それは自動的に置き換えられます (いくつかの条件に従います。以下のエラーを参照してください)。そのため、newpath にアクセスしようとする別のプロセスがそれを見つけられない点はありません。