複数の Perl スクリプトが同じファイルを変更することに懸念がある場合は、それぞれのスクリプトでflock()関数を使用して、関心のあるファイルをロックしてください。
おそらく制御できない外部プロセスが心配な場合は、sysopen()関数を使用できます。Programming Perlの本によると(ちなみに、これを強くお勧めします):
この上書きの問題を解決するにはsysopen
、新しいファイルを作成するか、既存のファイルを上書きするかを個別に制御できる を使用する必要があります。そして、その–e
ファイル存在テストは、ここでは有用な目的を果たさず、競合状態への露出を増やすだけなので、捨てます。
また、次のサンプル コード ブロックも提供されます。
use Fcntl qw/O_WRONLY O_CREAT O_EXCL/;
open(FH, "<", $file)
|| sysopen(FH, $file, O_WRONLY | O_CREAT | O_EXCL)
|| die "can't create new file $file: $!";
この例では、最初にいくつかの定数 (sysopen
呼び出しで使用される) を取り込みます。次に、 でファイルを開こうとしopen
、それが失敗した場合は を試しsysopen
ます。彼らは続けてこう言います:
sysopen
open が失敗してから書き込み用に新しいファイルを開こうとするまでの間にファイルが何らかの形で存在するようになったとしても、提供されたフラグsysopen
を使用すると、既に存在するファイルを開くことを拒否するため、害はありません。
そのため、状況を明確にするために、ファイル テストを完全に削除し (ステージ 1 を削除)、上記のブロックと同様のコードを使用して開く操作のみを実行します。問題が解決しました!