fcntl — Системные вызовы fcntl и ioctl
Этот модуль выполняет управление файлами и управлением вводом-выводом для дескрипторов файлов. Это интерфейс к fcntl() и ioctl() Unix-функциям. Для получения полного описания этих вызовов см. страницы руководства fcntl(2) и ioctl(2).
Все функции в этом модуле принимают дескриптор файла 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, которые используются при работе с блокировками открытых описаний файлов.
Модуль определяет следующие функции:
-
fcntl.fcntl(fd, cmd, arg=0) -
Выполняет операцию cmd с дескриптором файла fd (также принимаются объекты файлов, предоставляющие метод
fileno()). Значения, используемые для cmd, зависят от операционной системы и доступны как константы в модулеfcntlс теми же именами, что и в соответствующих C-заголовочных файлах. Аргумент arg может быть целочисленным значением или объектомbytes. При целочисленном значении, возвращаемое значение этой функции — это целочисленное возвращаемое значение C-вызоваfcntl(). Когда аргумент является объектом байтов, он представляет бинарную структуру, например, созданную функциейstruct.pack(). Бинарные данные копируются в буфер, адрес которого передаётся C-вызовуfcntl(). Возвращаемое значение после успешного вызова — содержимое буфера, преобразованное в объект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 — одно из следующих значений:-
LOCK_UN— разблокировать -
LOCK_SH— получить общую блокировку -
LOCK_EX— получить эксклюзивную блокировку
Когда cmd равно
LOCK_SHилиLOCK_EX, оно также может быть побитовым ИЛИ сLOCK_NBдля предотвращения блокировки при получении блокировки. Если используется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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/fcntl.html