8.10 Built-in Module fcntl
This module performs file control and I/O control on file descriptors.
It is an interface to the fcntl() and ioctl()
Unix routines. File descriptors can be obtained with the
fileno() method of a file or socket object.
The module defines the following functions:
- fcntl (fd, op[, arg])
-
Perform the requested operation on file descriptor fd.
The operation is defined by op and is operating system
dependent. Typically these codes can be retrieved from the library
module FCNTL . The argument arg
is optional, and defaults to the integer value 0. When
present, it can either be an integer value, or a string. With
the argument missing or an integer value, the return value of this
function is the integer return value of the C fcntl()
call. When the argument is a string it represents a binary
structure, e.g. created by struct.pack(). The binary
data is copied to a buffer whose address is passed to the C
fcntl() call. The return value after a successful call
is the contents of the buffer, converted to a string object. In
case the fcntl() fails, an IOError is
raised.
- ioctl (fd, op, arg)
-
This function is identical to the fcntl() function, except
that the operations are typically defined in the library module
IOCTL.
- flock (fd, op)
-
Perform the lock operation op on file descriptor fd.
See the Unix manual flock(3) for details. (On some
systems, this function is emulated using fcntl().)
- lockf (fd, code, [len, [start, [whence]]])
-
This is a wrapper around the FCNTL.F_SETLK and
FCNTL.F_SETLKW fcntl() calls. See the Unix
manual for details.
If the library modules FCNTL or
IOCTL are missing, you can find the
opcodes in the C include files <sys/fcntl.h> and
<sys/ioctl.h>. You can create the modules yourself with the
h2py script, found in the "Tools/scripts/" directory.
Examples (all on a SVR4 compliant system):
import struct, FCNTL
file = open(...)
rv = fcntl(file.fileno(), FCNTL.O_NDELAY, 1)
lockdata = struct.pack('hhllhh', FCNTL.F_WRLCK, 0, 0, 0, 0, 0)
rv = fcntl(file.fileno(), FCNTL.F_SETLKW, lockdata)
Note that in the first example the return value variable rv will
hold an integer value; in the second example it will hold a string
value. The structure lay-out for the lockdata variable is
system dependent -- therefore using the flock() call may be
better.
guido@python.org