Locking a File
Problem
Many processes need to update the same file simultaneously.
Solution
Have all processes honor advisory locking by using
flock
:
open(FH, "+< $path") or die "can't open $path: $!"; flock(FH, 2) or die "can't flock $path: $!"; # update file, then... close(FH) or die "can't close $path: $!";
Discussion
Operating systems vary greatly in the type and reliability of locking
techniques available. Perl tries hard to give you something that
works, even if your operating system uses its own underlying
technique. The flock
function takes two arguments:
a filehandle and a number representing what to do with the lock on
that filehandle. The numbers are normally represented by names like
LOCK_EX, which you can get from the Fcntl or IO::File modules.
The LOCK_SH, LOCK_EX, LOCK_UN, and LOCK_NB symbolic values were not
available in the Fcntl module before the 5.004 release, and even now
they are available only if you ask for them specifically using the
:flock
tag. Their values are 1, 2, 4, and 8
respectively, which you may supply yourself instead of using the
symbolic constants. You’ll therefore often see people write:
sub LOCK_SH() { 1 } # Shared lock (for reading) sub LOCK_EX() { 2 } # Exclusive lock (for writing) sub LOCK_NB() { 4 } # Non-blocking request (don't stall) sub LOCK_UN() { 8 } # Free the lock (careful!)
Locks come in two varieties: shared and exclusive. Despite what you might infer by “exclusive,” processes aren’t required to obey locks on files. Another way of ...
Get Perl Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.