fcntl – системные вызовы fcntl и ioctl¶fcntl – 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.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. Двоичные данные копируются в буфер, адрес которого передаётся в вызов Cfcntl(). Возвращаемое значение после успешного вызова – содержимое буфера, преобразованное в объектbytes. Длина возвращаемого объекта будет такой же, как длина аргумента arg.Если вызов
fcntl()завершается неудачей, возбуждаетсяOSError.Примечание
Если тип или размер arg не совпадает с типом или размером аргумента операции (например, если передаётся целое число, когда ожидается указатель, или информация, возвращаемая операционной системой в буфер, превышает размер arg), это, скорее всего, приведёт к ошибке сегментации или более тонкому повреждению данных.
Вызывает событие аудита
fcntl.fcntlс аргументамиfd,cmd,arg.Изменено в версии 3.14: Добавлена поддержка произвольных байтоподобных объектов, а не только
bytes.Изменено в версии 3.15: Размер байтоподобных объектов больше не ограничен 1024 байтами.
- 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 не совпадает с типом или размером аргумента операции (например, если передаётся целое число, когда ожидается указатель, или информация, возвращаемая операционной системой в буфер, превышает размер arg), это, скорее всего, приведёт к ошибке сегментации или более тонкому повреждению данных.
Пример:
>>> 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, автоматически повторяются.
Изменено в версии 3.15: Размер неизменённых байтоподобных объектов больше не ограничен 1024 байтами.
- 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() может быть предпочтительнее.