Spec-Zone.ru › Python 3.14

fcntl — системные вызовы fcntl и ioctl

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

Доступность: 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, позволяющие совместно использовать некоторые данные одного файла с другим посредством reflink в некоторых файловых системах (например, 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_*, позволяющие сообщить ядру об относительном ожидаемом сроке хранения записей для заданного inode или через определённое открытое файловое описание. В 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 может быть целым числом, объектом, подобным bytes, либо строкой. Тип и размер arg должны соответствовать типу и размеру аргумента операции, указанным в соответствующей документации C.

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

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

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

Примечание

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

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

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

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

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

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

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

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

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

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

Примечание

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

Пример:

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

См. также

Module os

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

© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/fcntl.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API