mt2k has asked for the wisdom of the Perl Monks concerning the following question:
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Flocking
by Ovid (Cardinal) on Jun 22, 2000 at 21:42 UTC | |
This code allows you to open the file, read its contents, modify them, and write them back out without having to close and reopen. I haven't tested it with flocking, so you'll need to play with it to see what type of flock works. Please note that flocking a file doesn't stop others from playing with it. They can still modify the file if they don't check to see if it's flocked. Further resources:
Cheers! PS: I took the above code straight from the Perl Cookbook. Beg your parents for a copy. | [reply] [d/l] |
|
Re: Flocking
by chromatic (Archbishop) on Jun 22, 2000 at 21:48 UTC | |
On a non-braindead operating system, many processes can simultaneously acquire a shared lock on a file, but an exclusive lock can only be held by one, and it usually blocks until all other locks (including shared locks) are released. You have a couple of options. You could open the file for read/write access with an exclusive lock, at the beginning of your program. That's conceptually simple, but you'll have to "rewind" it after reading, if you want to overwrite it. (See seek.) It also has the drawback that if another process has any lock on the file, your program will block (unless you work around it). This is the technique I'd choose. You could also continue with the code above. If you don't close the filehandle explicitly, Perl will do that for you implicitly. Closing a filehandle has the side effects of flushing buffers and unlocking any locks on it. I doubt your code to open the filehandle to a different file and acquire an exclusive lock is an atomic operation. (It probably takes more than one processor cycle to accomplish, so there is a possibility another process could jump in there and grab a lock. Of course, any process that doesn't check for locks could do that anyway.) The best advice I can think of is to make sure that any other process that might access the file also use the same flock technique you decide on. Disclaimer: I'm not as smart as I seem, sometimes. | [reply] |
|
RE: Flocking
by flyfishin (Monk) on Jun 22, 2000 at 21:44 UTC | |
| [reply] [d/l] |
by merlyn (Sage) on Jun 23, 2000 at 00:35 UTC | |
| [reply] |
|
Re: Flocking
by mt2k (Hermit) on Jun 22, 2000 at 21:54 UTC | |
I thought it was automatic that a file was actually locked and that the interpreter checked to see if the file had been locked. How, then, can I check to see if a file is locked? | [reply] |
by takshaka (Friar) on Jun 23, 2000 at 06:42 UTC | |
This is all in the perlfunc manpage, though the 5.6 docs are clearer... Two potentially non-obvious but traditional flock semantics are that it waits indefinitely until the lock is granted, and that its locks merely advisory. Such discretionary locks are more flexible, but offer fewer guarantees. This means that files locked with flock may be modified by programs that do not also use flock. | [reply] |