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 ...

Get Python Standard Library now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.