Help! File Locking
Donn Cave
donn at u.washington.edu
Fri Jul 9 12:31:16 EDT 1999
chacs <cs at ctzen.com> writes:
| Need some help in file locking.
|
| x1.py:
| import fcntl, FCNTL
| f = open('myfile', 'r+')
| fcntl.flock(f.fileno(), FCNTL.LOCK_EX)
| input()
| x = str(int(f.readline()) + 1)
| f.seek(0)
| f.write(x)
| fcntl.flock(f.fileno(), FCNTL.LOCK_UN)
| f.close()
I'd guess there may be a hole in the file interlocks here. The file
object "f" buffers writes (in the underlying C library stdio). The
real I/O to the file doesn't happen until the close(), which happens
after the file lock has been released and the other process waiting
for the lock wakes up.
Solution would be to insert f.flush() before releasing the lock.
Or just use posix open/read/write functions directly.
Donn Cave, University Computing Services, University of Washington
donn at u.washington.edu
.............................
| x2.py:
| import fcntl, FCNTL
| f = open('myfile', 'r+')
| fcntl.flock(f.fileno(), FCNTL.LOCK_EX)
| x = str(int(f.readline()) + 1)
| f.seek(0)
| f.write(x)
| fcntl.flock(f.fileno(), FCNTL.LOCK_UN)
| f.close()
|
| Both script are the same except x1 has an additional input() statement.
|
| Basically, what the script does is to open a file, lock it and update
| the first line to the next higher number.
|
| My problem is (assume file content is "0"):
|
| 1. in shell 1, run x1.py, x1 got lock and block at input().
| 2. in shell 2, run x2.py, x2 block at flock().
| 3. in shell 1, input something to unblock input().
| 4. x1 update "0" to "1", unlock and exit.
| 5. x2 gets lock, BUT instead of getting the new file content (i.e. "1")
| written by x1, it got the old content and update the file to "1" again
| (instead of reading "1" and update to "2").
|
| Any idea what is wrong ?
|
| Thanx in advance.
|
| C S Chang
| cs at ctzen.com
More information about the Python-list
mailing list