1:mod:`fcntl` --- The ``fcntl`` and ``ioctl`` system calls 2========================================================= 3 4.. module:: fcntl 5 :platform: Unix 6 :synopsis: The fcntl() and ioctl() system calls. 7 8.. sectionauthor:: Jaap Vermeulen 9 10.. index:: 11 pair: UNIX; file control 12 pair: UNIX; I/O control 13 14---------------- 15 16This module performs file control and I/O control on file descriptors. It is an 17interface to the :c:func:`fcntl` and :c:func:`ioctl` Unix routines. For a 18complete description of these calls, see :manpage:`fcntl(2)` and 19:manpage:`ioctl(2)` Unix manual pages. 20 21All functions in this module take a file descriptor *fd* as their first 22argument. This can be an integer file descriptor, such as returned by 23``sys.stdin.fileno()``, or an :class:`io.IOBase` object, such as ``sys.stdin`` 24itself, which provides a :meth:`~io.IOBase.fileno` that returns a genuine file 25descriptor. 26 27.. versionchanged:: 3.3 28 Operations in this module used to raise an :exc:`IOError` where they now 29 raise an :exc:`OSError`. 30 31.. versionchanged:: 3.8 32 The fcntl module now contains ``F_ADD_SEALS``, ``F_GET_SEALS``, and 33 ``F_SEAL_*`` constants for sealing of :func:`os.memfd_create` file 34 descriptors. 35 36.. versionchanged:: 3.9 37 On macOS, the fcntl module exposes the ``F_GETPATH`` constant, which obtains 38 the path of a file from a file descriptor. 39 On Linux(>=3.15), the fcntl module exposes the ``F_OFD_GETLK``, ``F_OFD_SETLK`` 40 and ``F_OFD_SETLKW`` constants, which working with open file description locks. 41 42.. versionchanged:: 3.10 43 On Linux >= 2.6.11, the fcntl module exposes the ``F_GETPIPE_SZ`` and 44 ``F_SETPIPE_SZ`` constants, which allow to check and modify a pipe's size 45 respectively. 46 47The module defines the following functions: 48 49 50.. function:: fcntl(fd, cmd, arg=0) 51 52 Perform the operation *cmd* on file descriptor *fd* (file objects providing 53 a :meth:`~io.IOBase.fileno` method are accepted as well). The values used 54 for *cmd* are operating system dependent, and are available as constants 55 in the :mod:`fcntl` module, using the same names as used in the relevant C 56 header files. The argument *arg* can either be an integer value, or a 57 :class:`bytes` object. With an integer value, the return value of this 58 function is the integer return value of the C :c:func:`fcntl` call. When 59 the argument is bytes it represents a binary structure, e.g. created by 60 :func:`struct.pack`. The binary data is copied to a buffer whose address is 61 passed to the C :c:func:`fcntl` call. The return value after a successful 62 call is the contents of the buffer, converted to a :class:`bytes` object. 63 The length of the returned object will be the same as the length of the 64 *arg* argument. This is limited to 1024 bytes. If the information returned 65 in the buffer by the operating system is larger than 1024 bytes, this is 66 most likely to result in a segmentation violation or a more subtle data 67 corruption. 68 69 If the :c:func:`fcntl` fails, an :exc:`OSError` is raised. 70 71 .. audit-event:: fcntl.fcntl fd,cmd,arg fcntl.fcntl 72 73 74.. function:: ioctl(fd, request, arg=0, mutate_flag=True) 75 76 This function is identical to the :func:`~fcntl.fcntl` function, except 77 that the argument handling is even more complicated. 78 79 The *request* parameter is limited to values that can fit in 32-bits. 80 Additional constants of interest for use as the *request* argument can be 81 found in the :mod:`termios` module, under the same names as used in 82 the relevant C header files. 83 84 The parameter *arg* can be one of an integer, an object supporting the 85 read-only buffer interface (like :class:`bytes`) or an object supporting 86 the read-write buffer interface (like :class:`bytearray`). 87 88 In all but the last case, behaviour is as for the :func:`~fcntl.fcntl` 89 function. 90 91 If a mutable buffer is passed, then the behaviour is determined by the value of 92 the *mutate_flag* parameter. 93 94 If it is false, the buffer's mutability is ignored and behaviour is as for a 95 read-only buffer, except that the 1024 byte limit mentioned above is avoided -- 96 so long as the buffer you pass is at least as long as what the operating system 97 wants to put there, things should work. 98 99 If *mutate_flag* is true (the default), then the buffer is (in effect) passed 100 to the underlying :func:`ioctl` system call, the latter's return code is 101 passed back to the calling Python, and the buffer's new contents reflect the 102 action of the :func:`ioctl`. This is a slight simplification, because if the 103 supplied buffer is less than 1024 bytes long it is first copied into a static 104 buffer 1024 bytes long which is then passed to :func:`ioctl` and copied back 105 into the supplied buffer. 106 107 If the :c:func:`ioctl` fails, an :exc:`OSError` exception is raised. 108 109 An example:: 110 111 >>> import array, fcntl, struct, termios, os 112 >>> os.getpgrp() 113 13341 114 >>> struct.unpack('h', fcntl.ioctl(0, termios.TIOCGPGRP, " "))[0] 115 13341 116 >>> buf = array.array('h', [0]) 117 >>> fcntl.ioctl(0, termios.TIOCGPGRP, buf, 1) 118 0 119 >>> buf 120 array('h', [13341]) 121 122 .. audit-event:: fcntl.ioctl fd,request,arg fcntl.ioctl 123 124 125.. function:: flock(fd, operation) 126 127 Perform the lock operation *operation* on file descriptor *fd* (file objects providing 128 a :meth:`~io.IOBase.fileno` method are accepted as well). See the Unix manual 129 :manpage:`flock(2)` for details. (On some systems, this function is emulated 130 using :c:func:`fcntl`.) 131 132 If the :c:func:`flock` fails, an :exc:`OSError` exception is raised. 133 134 .. audit-event:: fcntl.flock fd,operation fcntl.flock 135 136 137.. function:: lockf(fd, cmd, len=0, start=0, whence=0) 138 139 This is essentially a wrapper around the :func:`~fcntl.fcntl` locking calls. 140 *fd* is the file descriptor (file objects providing a :meth:`~io.IOBase.fileno` 141 method are accepted as well) of the file to lock or unlock, and *cmd* 142 is one of the following values: 143 144 * :const:`LOCK_UN` -- unlock 145 * :const:`LOCK_SH` -- acquire a shared lock 146 * :const:`LOCK_EX` -- acquire an exclusive lock 147 148 When *cmd* is :const:`LOCK_SH` or :const:`LOCK_EX`, it can also be 149 bitwise ORed with :const:`LOCK_NB` to avoid blocking on lock acquisition. 150 If :const:`LOCK_NB` is used and the lock cannot be acquired, an 151 :exc:`OSError` will be raised and the exception will have an *errno* 152 attribute set to :const:`EACCES` or :const:`EAGAIN` (depending on the 153 operating system; for portability, check for both values). On at least some 154 systems, :const:`LOCK_EX` can only be used if the file descriptor refers to a 155 file opened for writing. 156 157 *len* is the number of bytes to lock, *start* is the byte offset at 158 which the lock starts, relative to *whence*, and *whence* is as with 159 :func:`io.IOBase.seek`, specifically: 160 161 * :const:`0` -- relative to the start of the file (:data:`os.SEEK_SET`) 162 * :const:`1` -- relative to the current buffer position (:data:`os.SEEK_CUR`) 163 * :const:`2` -- relative to the end of the file (:data:`os.SEEK_END`) 164 165 The default for *start* is 0, which means to start at the beginning of the file. 166 The default for *len* is 0 which means to lock to the end of the file. The 167 default for *whence* is also 0. 168 169 .. audit-event:: fcntl.lockf fd,cmd,len,start,whence fcntl.lockf 170 171Examples (all on a SVR4 compliant system):: 172 173 import struct, fcntl, os 174 175 f = open(...) 176 rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NDELAY) 177 178 lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0) 179 rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata) 180 181Note that in the first example the return value variable *rv* will hold an 182integer value; in the second example it will hold a :class:`bytes` object. The 183structure lay-out for the *lockdata* variable is system dependent --- therefore 184using the :func:`flock` call may be better. 185 186 187.. seealso:: 188 189 Module :mod:`os` 190 If the locking flags :data:`~os.O_SHLOCK` and :data:`~os.O_EXLOCK` are 191 present in the :mod:`os` module (on BSD only), the :func:`os.open` 192 function provides an alternative to the :func:`lockf` and :func:`flock` 193 functions. 194