fcntl — Системные вызовы fcntl и ioctl
Этот модуль выполняет управление файлами и вводом-выводом по дескрипторам файлов. Он является интерфейсом к fcntl() и ioctl() Unix-овским функциям. Подробную информацию см. в руководстве по 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_*, которые позволяют сообщать ядру об ожидаемой относительной продолжительности записи в данном узле или через конкретное описание открытого файла. В 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. С целочисленным значением возвращаемое значение этой функции — целочисленное возвращаемое значение вызова 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.
Если оно ложно, изменчивость буфера игнорируется, и поведение такое же, как для буфера только для чтения, за исключением того, что ограничение в 1024 байта выше не применяется – поэтому, если буфер, который вы передаёте, по крайней мере, так же длинный, как хочет операционная система, всё должно работать.
Если mutate_flag истинно (по умолчанию), буфер (по сути) передаётся в системный вызов
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.
Поднимает событие аудита auditing event
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.13/library/fcntl.html