あり>
と>>
との競合状態であるが、それは、+<
を使用して回避することができます。
# >
open(my $fh, '+<', $qfn) or die $!;
flock($fh, LOCK_EX) or die $!;
truncate($fh, 0) or die $!;
...
# >>
open(my $fh, '+<', $qfn) or die $!;
flock($fh, LOCK_EX) or die $!;
seek($fh, 0, SEEK_END) or die $!;
...
あなたが記述するシナリオにも競合状態があります。
Writer Reader
========================= =========================
- opens file
- opens file
- locks file
- obtains lock on file
- locks file [blocks] - reads the file [empty]
- closes and unlocks file
- obtains lock on file
- writes to file
- writes to file
- closes and unlocks file
この問題を回避するための一般的な戦略は、作家
- 一時ディレクトリにファイルを作成することですし、その後
rename
ディレクトリ読者モニターファイルにファイル完了です。
rename
はアトミックアクションであるため、ファイルは完全にリーダが監視するディレクトリに表示されます。これにはライターの協力が必要ですが、最善の解決策があります。
http://perl.plover.com/yak/flock/samples/slide011.html – daxim
@daximそれが唯一の_advisory_ロックだ - それは開口部からセマフォのセマンティクスに従わないのプロセスを防ぐことはできません。ファイル。 – Alnitak