The fcntl Module
(Unix only) The fcntl module provides an interface to the
ioctl and fcntl functions on
Unix. They are used for “out of band” operations on file
handles and I/O device handles. This includes things like reading
extended attributes, controlling blocking, modifying terminal
behavior, and so on.
Exactly how to use these functions is highly platform dependent. For more information on what you can do on your platform, check the corresponding Unix manpages.
This module also provides an interface to Unix’s file locking
mechanisms. Example 12-1 uses the flock
function to place an advisory lock on the file,
while it is being updated.
The output shown later was obtained by running three instances of the program in parallel, like this (all on one command line):
python fcntl-example-1.py& python fcntl-example-1.py& python fcntl-example-1.py&
If you comment out the call to
flock, the counter will not be updated properly.
Example 12-1. Using the fcntl Module
File: fcntl-example-1.py
import fcntl, FCNTL
import os, time
FILE = "counter.txt"
if not os.path.exists(FILE):
# create the counter file if it doesn't exist
file = open(FILE, "w")
file.write("0")
file.close()
for i in range(20):
# increment the counter
file = open(FILE, "r+")
fcntl.flock(file.fileno(), FCNTL.LOCK_EX)
counter = int(file.readline()) + 1
file.seek(0)
file.write(str(counter))
file.close() # unlocks the file
print os.getpid(), "=>", counter
time.sleep(0.1)
30940 => 1
30942 => 2
30941 => 3
30940 => 4
30941 => 5 ...Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access