File locking in Perl is done with the flock()
function. It's portable among architectures, is advisory-only and locks full files.
It accepts two arguments: a file handle and an operation id. As expected, it allows only one writer or many simultaneous readers, with no wait. Locks are automatically released on closing. The usage is simple:
1. Open the file (for reading or writing).
2. Call flock() with the file handle, and a second argument of 1 (if reading) or 2 (if writing).
3. Do whatever operations you do to the file.
4. Close it.
And that's it. The magic numbers 1 and 2 can also be used as LOCK_*
constants imported from the Flock
module. The perldoc
documentation is comprehensive, take a look at it.
Example reader:
open F, 'index.db'; # open for reading # lock file. If a writer has it locked, it will # wait until released. Many readers will read the # file simultaneously without blocking. flock F, 1; while (<F>) { # do things... } # lock is released close F;
And a writer:
open F, '>index.db'; # open for writing # lock file for writing. If there is another reader # or writer using the lock, it will block until # released. flock F, 2; # file is now locked # write stuff to the file... # lock is released; any readers or writers waiting # will unblock and go on with its business close F;
As these locking semantics are advisory-only, anyone can screw everything by writing without locking, so take care.