O'Reilly logo

Perl for Web Site Management by John Callender

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

File Locking

Back in Chapter 12, we instituted file locking for a guestbook CGI script using Perl’s sysopen function, and some fancy magic involving rewinding and truncating the guestbook file to write to it after obtaining an exclusive lock. The approach to file locking that we’ll be using in this case is different, in that it is based on the concept of a semaphore file. I first heard about semaphore files from Mark-Jason Dominus, one of the coolest Perl gurus around when it comes to explaining nifty Perl tricks in language even accidental programmers can understand.

The notion of a semaphore file sounded very familiar to me when I first heard about it, and after a few seconds I realized why: I had already been exposed to the concept back in kindergarten. All of us kids would sit in a circle, and when I wanted to say something I had to wait to be handed a special stuffed elephant that meant it was my turn to talk. Because there was only one stuffed elephant, there would (in theory) only be one child talking at any given time.

The semaphore file is the make_cf.plx script’s stuffed elephant. Only one copy of the script gets to hold it at a time, and only the copy holding it gets to read from and write to the CyberFair pages.

Here’s how it works. Up near the top of the make_cf.plx script (which was given as Example 15-1, back in Chapter 15), before any reading or writing has taken place, we add the following lines:

use Fcntl ':flock'; my $lock_file = '/my/private/dir/cyberfair.lock'; ...

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required