fcntl — Системные вызовы fcntl и ioctl
Этот модуль выполняет управление файлами и вводом-выводом для файловых дескрипторов. Он служит интерфейсом к процедурам Unix fcntl() и ioctl(). Подробные сведения см. на страницах руководства Unix fcntl(2) и ioctl(2).
Доступность: Unix, кроме Emscripten и 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). Такое поведение обычно называют «копированием при записи».
Модуль определяет следующие функции:
-
fcntl.fcntl(fd, cmd, arg=0) -
Выполняет операцию cmd над файловым дескриптором fd (также принимаются файловые объекты, предоставляющие метод
fileno()). Значения для cmd зависят от операционной системы и доступны в виде констант модуляfcntlпод теми же именами, что и в соответствующих заголовочных файлах C. Аргумент arg может быть целочисленным значением или объектомbytes. Если передано целочисленное значение, возвращаемое этой функцией значение — это целочисленное значение, возвращаемое вызовом Cfcntl(). Если аргумент имеет тип bytes, он представляет собой двоичную структуру, например созданную с помощьюstruct.pack(). Двоичные данные копируются в буфер, адрес которого передаётся вызову Cfcntl(). При успешном вызове содержимое буфера преобразуется в объектbytesи возвращается. Длина возвращённого объекта будет такой же, как длина аргумента arg. Она ограничена 1024 байтами. Если информация, возвращённая операционной системой в буфер, превышает 1024 байта, это, скорее всего, приведёт к нарушению сегментации или более незаметному повреждению данных.Если вызов
fcntl()завершается с ошибкой, возникает исключениеOSError.Вызывает событие аудита
fcntl.fcntlс аргументамиfd,cmd,arg.
-
fcntl.ioctl(fd, request, arg=0, mutate_flag=True) -
Эта функция идентична функции
fcntl(), за исключением того, что обработка аргументов ещё сложнее.Параметр request ограничен значениями, которые помещаются в 32 бита. Дополнительные интересующие константы, используемые в качестве аргумента request, можно найти в модуле
termiosпод теми же именами, что и в соответствующих заголовочных файлах C.Параметр arg может быть целым числом, объектом, поддерживающим интерфейс буфера только для чтения (например,
bytes), или объектом, поддерживающим интерфейс буфера для чтения и записи (например,bytearray).Во всех случаях, кроме последнего, поведение такое же, как у функции
fcntl().Если передан изменяемый буфер, поведение определяется значением параметра mutate_flag.
Если он имеет значение false, изменяемость буфера игнорируется, и поведение такое же, как для буфера только для чтения, за исключением того, что ограничение в 1024 байта, упомянутое выше, не применяется: если переданный буфер не короче данных, которые операционная система должна в него поместить, всё должно работать.
Если mutate_flag имеет значение true (по умолчанию), буфер (фактически) передаётся базовому системному вызову
ioctl(), его код возврата передаётся обратно вызывающему коду Python, а новое содержимое буфера отражает результат работыioctl(). Это небольшое упрощение: если переданный буфер короче 1024 байт, он сначала копируется в статический буфер длиной 1024 байта, который затем передаётсяioctl(), а после этого копируется обратно в переданный буфер.Если вызов
ioctl()завершается с ошибкой, возникает исключениеOSError.Пример:
>>> 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/fcntl.html