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, позволяющие совместно использовать часть данных одного файла с другим файлом посредством клонирования на некоторых файловых системах (например, 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.
Модуль определяет следующие функции:
-
fcntl.fcntl(fd, cmd, arg=0, /) -
Выполняет операцию cmd для файлового дескриптора fd (также принимаются файловые объекты, предоставляющие метод
fileno()). Значения cmd зависят от операционной системы и доступны в виде констант модуляfcntl; их имена совпадают с именами в соответствующих заголовочных файлах C. Аргумент arg может быть целочисленным значением, объектомbytesили строкой. Тип и размер arg должны соответствовать типу и размеру аргумента операции, указанным в соответствующей документации C.Если arg — целое число, функция возвращает целочисленное значение, возвращаемое вызовом C
fcntl().Если аргумент имеет тип bytes, он представляет собой двоичную структуру, например созданную с помощью
struct.pack(). Строковое значение преобразуется в двоичные данные с использованием кодировки UTF-8. Двоичные данные копируются в буфер, адрес которого передаётся вызову Cfcntl(). После успешного вызова возвращается содержимое буфера, преобразованное в объектbytes. Длина возвращаемого объекта будет такой же, как длина аргумента arg. Максимальная длина — 1024 байта.Если вызов
fcntl()завершается ошибкой, возникает исключениеOSError.Примечание
Если тип или размер arg не совпадает с типом или размером аргумента операции (например, если вместо ожидаемого указателя передано целое число или возвращённая операционной системой информация в буфере превышает 1024 байта), это, скорее всего, приведёт к ошибке сегментации или более трудно обнаруживаемому повреждению данных.
Вызывает событие аудита
fcntl.fcntlс аргументамиfd,cmd,arg.
-
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.
-
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() может оказаться предпочтительнее.
См. также
© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/fcntl.html