Well, you can use flock():
#!/usr/bin/perl
use strict;
use Fcntl ':flock'; # import LOCK_* constants
open(MYFILE, ">testing");
flock(MYFILE, LOCK_EX);
print "file locked\n"; sleep(100);
flock(MYFILE, LOCK_UN);
print "file unlocked\n";
close MYFILE;
That will lock it as far as other processes that use flock()
are concerned. Ie: if you run that, (and it locks and goes
to sleep for 100 seconds) and then run another instance of it
while the first is sleeping, it will wait for the other to
unlock the file. However, if you run one instance of that
and "echo lala > testing" it will ignore the lock and just
write the file.
I don't know enough to say wether using fcntl() might yeild
better results when dealing with other processes that don't
try to lock the file before accessing it.
I'd say look at the perldocs on flock() and fcntl() or do
some kind of cooperative locking. Ie: touch a lockfile
and check it before opening the real file. | [reply] |
| [reply] |
Update: The question that this is
answering seems to have disappeared. So bear with
me if the answer seems a bit strange.
Perl might even be using fcntl for the flock function:
if it can't find a local version of flock that it can use,
it will use fcntl instead. Generally, it's flock
or nothing: just make sure that all your processes
are using flock, and everything will be happy.
lockf and fcntl can still be used, but they
are heavy-duty solutions, and should only be
brought out when really, really needed, and you
really, really know what you are doing. The higher
level flock is quite sufficient for almost any
task
Also, make sure that you check the return values
of 'flock', as well as 'open' and 'close'. Specifically
unlocking a file is seldom necessary, as 'close'
is guaranteed to unlock it for you.
| [reply] |
open(FILE, ">testing")
you will truncate the file before you have it locked, this may not be what you want in a production system! Use
open(FILE, ">>testing")
before you get the lock and then truncate() if you want to, er, truncate the file once its locked. Or lock a separate semaphore file who's contents are unimportant. | [reply] [d/l] [select] |