LinuxのCでfcntlロックを使用していますが、fcntlロックメカニズムをチェックする他のプロセスからロックされている可能性のあるファイルを削除しようとするというジレンマがあります。削除する必要があるこのファイルを処理するための好ましい方法は何ですか(リーダーロックがある可能性のある他のプロセスに関係なく、単にファイルを削除する必要がありますか、それともより良い方法がありますか)?どんな助けでも大歓迎です。
3 に答える
UNIXシステムでは、ファイルが開いている間にファイルのリンクを解除することができます。そうすることで、ファイルの参照カウントが減少しますが、実際のファイルとそのiノードは、参照カウントがゼロになるまで残ります。
他の人が指摘しているように、ロックを保持している間でもファイルを自由に削除できます。
ここで、注意事項:プロセスがこのファイルをロックしている理由については言及していませんが、プロセス間同期にそのファイルを使用している場合は、削除することで、基本的にシステムに微妙な競合状態を導入するのに適しています。 1回の操作でファイルをアトミックに作成してロックする方法がないためです。
たとえば、プロセスAAは、ファイルをすぐにロックして、必要な更新を実行することを目的として、ファイルを作成する場合があります。ただし、プロセスBBが最初にファイルのロックを取得してからファイルを削除し、プロセスAAに現在削除されたファイルへのハンドルを残すことを妨げるものは何もありません。プロセスAAは引き続きそのファイルをロックおよび更新できますが、ファイルはすでに削除されているため、これらの更新は事実上「失われます」。
さらに、UNIXシステムのロックはデフォルトで勧告であり、必須ではないため、ファイルをロックしても、ファイルが再度ロックされるだけで、ファイルが開いたりリンクが解除されたりするのを防ぐことはできません。