2

POSIX環境で、ファイルをディスクから削除したいのですが、ファイルを削除する前にチェックサムを計算して、ファイルが変更されていないことを確認します。ロックは十分ですか?それを開き、リンクを解除し、チェックサムを計算してから閉じる必要がありますか(OSがiノードを削除できるようにするため)?他のプロセスがファイル上に開いているファイル記述子を持たないようにする方法はありますか?

少しコンテキストを与えるために、コードはホスト間でファイルの同期を実行します。リモートホストがファイルを削除したが、ファイルがローカルで変更されている場合、データが失われる可能性があります。

4

1 に答える 1

3

チェックサムが一致しない場合はスタックするため、open、unlink、checksum、closeの提案はそのままでは機能しません(ファイル記述子によって指定されたファイルへのリンクを作成するPOSIXポータブルな方法はありません) )。より良いバリアントは、rename、checksum、unlink、closeです。これにより、名前の変更を元に戻したり、チェックサムが一致しない場合にコピーをやり直したりできます。その間に3番目のプログラムがファイルを再作成した場合は、何をしたいかを考える必要があります。

POSIXは協調ロックのみを提供します。ファイルを変更する可能性のあるプログラムを制御できる場合は、それらがロックを使用していることを確認してください。それがオプションでない場合は、ロックなしで立ち往生しています。

どのプロセスがファイルを開いたか(または開いたかどうか)を確認するための移植可能な方法はありません。ほとんどのUnixシステムでは、lsofが表示されますが、これは普遍的ではなく、堅牢ではなく(プログラムは検索を終了した直後にファイルを開く可能性がありますlsof)、不完全です(ファイルがNFS経由でエクスポートされる場合、アクティブなクライアント)。

rsyncやunisonなど、他の同期プログラムが実行していることを確認することでメリットが得られる場合があります。

于 2010-07-15T19:51:37.453 に答える