Home
Search Perl pages
Subjects
By activity
Professions, Sciences, Humanities, Business, ...
User Interface
Text-based, GUI, Audio, Video, Keyboards, Mouse, Images,...
Text Strings
Conversions, tests, processing, manipulation,...
Math
Integer, Floating point, Matrix, Statistics, Boolean, ...
Processing
Algorithms, Memory, Process control, Debugging, ...
Stored Data
Data storage, Integrity, Encryption, Compression, ...
Communications
Networks, protocols, Interprocess, Remote, Client Server, ...
Hard World Timing, Calendar and Clock, Audio, Video, Printer, Controls...
File System
Management, Filtering, File & Directory access, Viewers, ...
|
|
|
flock FILEHANDLE,OPERATION
Calls flock(2), or an emulation of it, on
FILEHANDLE. Returns
TRUE for success,
FALSE on failure. Produces a fatal error if used on a machine that doesn't implement flock(2), fcntl(2) locking, or lockf(3). flock() is Perl's portable file locking interface, although it locks only entire files, not records.
OPERATION is one of
LOCK_SH,
LOCK_EX, or
LOCK_UN, possibly combined with
LOCK_NB. These constants are traditionally valued 1, 2, 8 and 4, but you can use the symbolic names if import them from the Fcntl module, either individually, or as a group using the ':flock' tag.
LOCK_SH requests a shared lock,
LOCK_EX requests an exclusive lock, and
LOCK_UN releases a previously requested lock. If
LOCK_NB is added to
LOCK_SH or
LOCK_EX then flock() will return immediately rather than blocking waiting for the lock (check the return status to see if you got it).
To avoid the possibility of mis-coordination, Perl flushes
FILEHANDLE before (un)locking it.
Note that the emulation built with lockf(3) doesn't provide shared locks, and it requires that
FILEHANDLE be open with write intent. These are the semantics that lockf(3) implements. Most (all?) systems implement lockf(3) in terms of fcntl(2) locking, though, so the differing semantics shouldn't bite too many people.
Note also that some versions of flock() cannot lock things
over the network; you would need to use the more system-specific
fcntl() for that. If you like you can force Perl to ignore
your system's flock(2) function, and so provide its own
fcntl(2)-based emulation, by passing the switch -Ud_flock to the Configure program when you configure perl.
Here's a mailbox appender for
BSD systems.
use Fcntl ':flock'; # import LOCK_* constants
sub lock {
flock(MBOX,LOCK_EX);
# and, in case someone appended
# while we were waiting...
seek(MBOX, 0, 2);
}
sub unlock {
flock(MBOX,LOCK_UN);
}
open(MBOX, ">>/usr/spool/mail/$ENV{'USER'}")
or die "Can't open mailbox: $!";
lock();
print MBOX $msg,"\n\n";
unlock();
See also DB_File for other flock() examples.
Source: Perl builtin functions Copyright: Larry Wall, et al. |
Next: fork
Previous: fileno FILEHANDLE
(Corrections, notes, and links courtesy of RocketAware.com)
Up to: File Access Limits
Rapid-Links:
Search | About | Comments | Submit Path: RocketAware > Perl >
perlfunc/flock.htm
RocketAware.com is a service of Mib Software Copyright 2000, Forrest J. Cavalier III. All Rights Reserved. We welcome submissions and comments
|