Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re: Proper use of flock

by Aristotle (Chancellor)
on Oct 30, 2002 at 00:38 UTC ( #208932=note: print w/ replies, xml ) Need Help??


in reply to Proper use of flock

Start out with use Fcntl qw(:flock);
Right after you open a file for reading, do flock FH, LOCK_SH or die "Failed acquiring shared lock on $filename: $!";
If you want to write to a file, do flock FH, LOCK_EX or die "Failed acquiring ex. lock on $filename: $!";

DO NOT unlock the file, ever. Just close it. If you want to read from a file and then also write to it, then open it for reading and writing once, and get a shared lock. Once you want to write to it, upgrade to an exclusive lock by calling flock on the file handle again - do not close and reopen it. Don't downgrade that lock to a shared one either.

See perldoc -f flock for help on the function.

Makeshifts last the longest.


Comment on Re: Proper use of flock
Select or Download Code
Re: Re: Proper use of flock
by stupidius (Initiate) on Oct 30, 2002 at 01:23 UTC
    You are a wise and noble monk. Thank you for the info, and thanks for the correction on the other post!!!
Re: Re: Proper use of flock
by Helter (Chaplain) on Oct 30, 2002 at 15:00 UTC
    I agree with everything Aristotle said, I just wanted to point something out that may not be obvious.

    Where it says "If you want to write to a file, do"...

    Make sure you do NOT open the file with a single >, or in truncate mode.

    The lock is, as explained in the docs, only an advisory lock, which means if some code does not check the lock there are no restrictions on it going in and messing with the file.

    So while a good citizen your code locks a file and is doing some reading, a bad citizen could open, truncate, the file if they never check the lock, and your code will be out of luck.

    And not mentioned is locking multiple files, a common mistake is made in the order you lock files. The rule is, all code should lock resources in the same order. And when you release locks you should do in the inverse order. If you have some code that locks A, B, C, and other code that locks C, A you are going to eventually hit deadlock.

    Can you tell I made some mistakes in the past ;-)

    Hope this helps!

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://208932]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (18)
As of 2014-07-23 15:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (145 votes), past polls