Документация Python неофициальный перевод

fcntl – системные вызовы fcntl и ioctlfcntl – The fcntl and ioctl system calls


Этот модуль выполняет управление файлами и вводом-выводом на файловых дескрипторах. Он является интерфейсом к fcntl() и ioctl() процедурам Unix. За подробностями обращайтесь к fcntl(2) и ioctl(2) справочным страницам Unix.

Доступность: Unix, не WASI.

Все функции в этом модуле первым аргументом принимают файловый дескриптор fd. Это может быть целочисленный файловый дескриптор, например, возвращаемый sys.stdin.fileno(), или объект io.IOBase, такой как сам sys.stdin, который предоставляет fileno(), возвращающий настоящий файловый дескриптор.

Изменено в версии 3.3: Ранее операции в этом модуле вызывали IOError, теперь они вызывают OSError.

Изменено в версии 3.8: Модуль fcntl теперь содержит константы F_ADD_SEALS, F_GET_SEALS и F_SEAL_* для запечатывания os.memfd_create() файловых дескрипторов.

Изменено в версии 3.9: На macOS модуль fcntl предоставляет константу F_GETPATH, которая получает путь к файлу из файлового дескриптора. На Linux (>=3.15) модуль fcntl предоставляет константы F_OFD_GETLK, F_OFD_SETLK и F_OFD_SETLKW, используемые при работе с блокировками открытых файловых дескрипторов.

Изменено в версии 3.10: На Linux >= 2.6.11 модуль fcntl предоставляет константы F_GETPIPE_SZ и F_SETPIPE_SZ, которые позволяют проверять и изменять размер канала соответственно.

Изменено в версии 3.11: На FreeBSD модуль fcntl предоставляет константы F_DUP2FD и F_DUP2FD_CLOEXEC, которые позволяют дублировать файловый дескриптор, при этом последняя дополнительно устанавливает флаг FD_CLOEXEC.

Изменено в версии 3.12: На Linux >= 4.5 модуль fcntl предоставляет константы FICLONE и FICLONERANGE, которые позволяют совместно использовать часть данных одного файла с другим файлом через рефлинк в некоторых файловых системах (например, btrfs, OCFS2 и XFS). Такое поведение обычно называется «копирование при записи».

Изменено в версии 3.13: На Linux >= 2.6.32 модуль fcntl предоставляет константы F_GETOWN_EX, F_SETOWN_EX, F_OWNER_TID, F_OWNER_PID, F_OWNER_PGRP, которые позволяют направлять сигналы готовности ввода-вывода определённому потоку, процессу или группе процессов. На Linux >= 4.13 модуль fcntl предоставляет константы F_GET_RW_HINT, F_SET_RW_HINT, F_GET_FILE_RW_HINT, F_SET_FILE_RW_HINT и RWH_WRITE_LIFE_*, которые позволяют информировать ядро об относительном ожидаемом времени жизни записей для заданного индексного дескриптора или через конкретное описание открытого файла. На Linux >= 5.1 и NetBSD модуль fcntl предоставляет константу F_SEAL_FUTURE_WRITE для использования с операциями F_ADD_SEALS и F_GET_SEALS. На FreeBSD модуль fcntl предоставляет константы F_READAHEAD, F_ISUNIONSTACK и F_KINFO. На macOS и FreeBSD модуль fcntl предоставляет константу F_RDAHEAD. На NetBSD и AIX модуль fcntl предоставляет константу F_CLOSEM. На NetBSD модуль fcntl предоставляет константу F_MAXFD. На macOS и NetBSD модуль fcntl предоставляет константы F_GETNOSIGPIPE и F_SETNOSIGPIPE.

Изменено в версии 3.14: На Linux >= 6.1 модуль fcntl предоставляет F_DUPFD_QUERY для запроса файлового дескриптора, указывающего на тот же файл.

Модуль определяет следующие функции:

fcntl.fcntl(fd, cmd, arg=0, /)

Выполняет операцию cmd над файловым дескриптором fd (также принимаются файловые объекты, предоставляющие метод fileno()). Значения, используемые для cmd, зависят от операционной системы и доступны в виде констант в модуле fcntl с теми же именами, что и в соответствующих заголовочных файлах C. Аргумент arg может быть целым числом, байтоподобным объектом или строкой. Тип и размер arg должны соответствовать типу и размеру аргумента операции, как указано в соответствующей документации C.

Когда arg является целым числом, функция возвращает целочисленное возвращаемое значение вызова C fcntl().

Если аргумент является байтоподобным объектом, он представляет собой бинарную структуру, например, созданную struct.pack(). Строковое значение кодируется в двоичный вид с использованием кодировки UTF-8. Двоичные данные копируются в буфер, адрес которого передаётся вызову C fcntl(). Возвращаемое значение после успешного вызова – содержимое буфера, преобразованное в объект bytes. Длина возвращаемого объекта будет такой же, как длина аргумента arg. Это ограничение составляет 1024 байта.

Если вызов fcntl() завершается неудачей, возбуждается OSError.

Примечание

Если тип или размер arg не совпадает с типом или размером аргумента операции (например, если передаётся целое число, а ожидается указатель, или информация, возвращаемая в буфер операционной системой, превышает 1024 байта), это, скорее всего, приведёт к нарушению сегментации или более тонкому повреждению данных.

Вызывает событие аудита fcntl.fcntl с аргументами fd, cmd, arg.

Изменено в версии 3.14: Добавлена поддержка произвольных байтоподобных объектов, а не только bytes.

fcntl.ioctl(fd, request, arg=0, mutate_flag=True, /)

Эта функция идентична fcntl(), за исключением того, что обработка аргументов ещё более сложная.

Параметр request ограничен значениями, которые могут поместиться в 32 или 64 бита, в зависимости от платформы. Дополнительные константы, которые могут быть полезны в качестве аргумента request, можно найти в модуле termios под теми же именами, что и в соответствующих заголовочных файлах C.

Параметр arg может быть целым числом, байтоподобным объектом или строкой. Тип и размер arg должны соответствовать типу и размеру аргумента операции, как указано в соответствующей документации C.

Если arg не поддерживает интерфейс буфера для чтения-записи или mutate_flag равен false, поведение аналогично функции fcntl().

Если arg поддерживает интерфейс буфера для чтения-записи (например, bytearray) и mutate_flag равен true (по умолчанию), то буфер (фактически) передаётся нижележащему системному вызову ioctl(), код возврата последнего передаётся обратно в вызывающий код Python, а новое содержимое буфера отражает результат действия ioctl(). Это небольшое упрощение, потому что если предоставленный буфер короче 1024 байт, он сначала копируется в статический буфер длиной 1024 байта, который затем передаётся ioctl(), и результат копируется обратно в предоставленный буфер.

Если вызов ioctl() завершается неудачей, возбуждается исключение OSError.

Примечание

Если тип или размер arg не совпадает с типом или размером аргумента операции (например, передаётся целое число, а ожидается указатель, или информация, возвращаемая в буфер операционной системой, превышает 1024 байта, или размер изменяемого байтоподобного объекта слишком мал), это, скорее всего, приведёт к нарушению сегментации или более тонкому повреждению данных.

Пример:

>>> import array, fcntl, struct, termios, os
>>> os.getpgrp()
13341
>>> struct.unpack('h', fcntl.ioctl(0, termios.TIOCGPGRP, "  "))[0]
13341
>>> buf = array.array('h', [0])
>>> fcntl.ioctl(0, termios.TIOCGPGRP, buf, 1)
0
>>> buf
array('h', [13341])

Вызывает событие аудита fcntl.ioctl с аргументами fd, request, arg.

Изменено в версии 3.14: GIL всегда освобождается во время системного вызова. Системные вызовы, завершающиеся с ошибкой EINTR, автоматически повторяются.

fcntl.flock(fd, operation, /)

Выполняет операцию блокировки operation для файлового дескриптора fd (также принимаются файловые объекты, предоставляющие метод fileno()). Подробнее см. в руководстве Unix flock(2). (В некоторых системах эта функция эмулируется с помощью fcntl().)

Если вызов flock() завершается неудачей, возбуждается исключение OSError.

Возбуждает событие аудита fcntl.flock с аргументами fd, operation.

fcntl.lockf(fd, cmd, len=0, start=0, whence=0, /)

По сути, это обёртка вокруг вызовов блокировки fcntl(). fd – это файловый дескриптор (также принимаются файловые объекты, предоставляющие метод fileno()) файла, который нужно заблокировать или разблокировать, а cmd – одно из следующих значений:

fcntl.LOCK_UN

Освобождает существующую блокировку.

fcntl.LOCK_SH

Захватывает разделяемую блокировку.

fcntl.LOCK_EX

Захватывает исключительную блокировку.

fcntl.LOCK_NB

Побитовое ИЛИ с любой из трёх других констант LOCK_*, чтобы сделать запрос неблокирующим.

Если используется LOCK_NB и блокировку не удаётся захватить, будет возбуждено исключение OSError, и у исключения будет атрибут errno, установленный в EACCES или EAGAIN (в зависимости от операционной системы; для переносимости проверяйте оба значения). По крайней мере в некоторых системах LOCK_EX можно использовать только если файловый дескриптор ссылается на файл, открытый для записи.

len – количество байтов для блокировки, start – смещение в байтах, с которого начинается блокировка, относительно whence, а whence работает как в io.IOBase.seek(), а именно:

  • 0 – относительно начала файла (os.SEEK_SET)

  • 1 – относительно текущей позиции буфера (os.SEEK_CUR)

  • 2 – относительно конца файла (os.SEEK_END)

Значение по умолчанию для start – 0, то есть начало от начала файла. Значение по умолчанию для len – 0, то есть блокировка до конца файла. Значение по умолчанию для whence – также 0.

Возбуждает событие аудита fcntl.lockf с аргументами fd, cmd, len, start, whence.

Примеры (все на системе, совместимой с SVR4):

import struct, fcntl, os

f = open(...)
rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NDELAY)

lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)
rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata)

Обратите внимание, что в первом примере переменная возвращаемого значения rv будет содержать целое число; во втором примере она будет содержать объект bytes. Разметка структуры для переменной lockdata зависит от системы, поэтому использование вызова flock() может быть предпочтительнее.

См. также

Модуль os

Если флаги блокировки O_SHLOCK и O_EXLOCK присутствуют в модуле os (только в BSD), функция os.open() предоставляет альтернативу функциям lockf() и flock().