Un naufragio personal

File locking in Perl

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.


Visitor comments