Документация Python неофициальный перевод

fcntl.md

119 строк · 12.1 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.3/library/fcntl.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 34.9. [`fcntl`](https://python-all.ru/3.3/library/fcntl.html#module-fcntl) – Системные вызовы `fcntl` и `ioctl`89Этот модуль выполняет управление файлами и вводом-выводом для файловых дескрипторов. Он является интерфейсом к системным вызовам Unix `fcntl()` и `ioctl()`.1011Все функции в этом модуле принимают файловый дескриптор *fd* в качестве первого аргумента. Это может быть целочисленный файловый дескриптор, такой как возвращаемый `sys.stdin.fileno()`, или объект [`io.IOBase`](https://python-all.ru/3.3/library/io.html#io.IOBase), например сам `sys.stdin`, который предоставляет [`fileno()`](https://python-all.ru/3.3/library/io.html#io.IOBase.fileno), возвращающий настоящий файловый дескриптор.1213Изменено в версии 3.3: Операции в этом модуле раньше вызывали [`IOError`](https://python-all.ru/3.3/library/exceptions.html#IOError), а теперь вызывают [`OSError`](https://python-all.ru/3.3/library/exceptions.html#OSError).1415Модуль определяет следующие функции:1617#### `fcntl.fcntl(fd, op[, arg])`1819Выполняет операцию *op* над файловым дескриптором *fd* (также принимаются файловые объекты, предоставляющие метод [`fileno()`](https://python-all.ru/3.3/library/io.html#io.IOBase.fileno)). Значения, используемые для *op*, зависят от операционной системы и доступны в виде констант в модуле [`fcntl`](https://python-all.ru/3.3/library/fcntl.html#module-fcntl), с теми же именами, что и в соответствующих C-заголовочных файлах. Аргумент *arg* необязателен; по умолчанию равен целому числу `0`. Если он задан, то может быть как целым числом, так и строкой. Если аргумент опущен или является целым числом, возвращаемое значение этой функции равно целочисленному результату C-вызова `fcntl()`. Если аргумент – строка, она представляет двоичную структуру, например, созданную с помощью [`struct.pack()`](https://python-all.ru/3.3/library/struct.html#struct.pack). Двоичные данные копируются в буфер, адрес которого передаётся C-вызову `fcntl()`. Возвращаемое значение после успешного вызова – содержимое буфера, преобразованное в строковый объект. Длина возвращаемой строки будет равна длине аргумента *arg*. Это ограничено 1024 байтами. Если информация, возвращаемая операционной системой в буфер, превышает 1024 байта, это, скорее всего, приведёт к ошибке сегментации или более тонкому повреждению данных.2021Если `fcntl()` завершается неудачей, возбуждается исключение [`OSError`](https://python-all.ru/3.3/library/exceptions.html#OSError).2223#### `fcntl.ioctl(fd, op[, arg[, mutate_flag]])`2425Эта функция идентична функции [`fcntl()`](https://python-all.ru/3.3/library/fcntl.html#fcntl.fcntl), за исключением того, что обработка аргументов ещё более сложная.2627The op parameter is limited to values that can fit in 32-bits. Additional constants of interest for use as the *op* argument can be found in the [`termios`](https://python-all.ru/3.3/library/termios.html#module-termios) module, under the same names as used in the relevant C header files.2829Параметр *arg* может быть целым числом, отсутствовать (рассматривается так же, как целое число `0`), объектом, поддерживающим интерфейс буфера только для чтения (скорее всего, обычная строка Python), или объектом, поддерживающим интерфейс буфера для чтения и записи.3031Во всех случаях, кроме последнего, поведение такое же, как для функции [`fcntl()`](https://python-all.ru/3.3/library/fcntl.html#fcntl.fcntl).3233Если передан изменяемый буфер, то поведение определяется значением параметра *mutate\_flag*.3435Если он ложен, изменяемость буфера игнорируется, и поведение такое же, как для буфера только для чтения, за исключением того, что упомянутое выше ограничение в 1024 байта не действует – до тех пор, пока передаваемый буфер имеет длину не меньше той, которую операционная система хочет туда записать, всё должно работать.3637Если *mutate\_flag* истинен (по умолчанию), то буфер (фактически) передаётся базовому системному вызову [`ioctl()`](https://python-all.ru/3.3/library/fcntl.html#fcntl.ioctl), его код возврата передаётся обратно в вызывающий код Python, а новое содержимое буфера отражает действие [`ioctl()`](https://python-all.ru/3.3/library/fcntl.html#fcntl.ioctl). Это небольшое упрощение, потому что если предоставленный буфер короче 1024 байт, он сначала копируется в статический буфер длиной 1024 байта, который затем передаётся [`ioctl()`](https://python-all.ru/3.3/library/fcntl.html#fcntl.ioctl) и копируется обратно в исходный буфер.3839Пример:4041```python42>>> import array, fcntl, struct, termios, os43>>> os.getpgrp()441334145>>> struct.unpack('h', fcntl.ioctl(0, termios.TIOCGPGRP, "  "))[0]461334147>>> buf = array.array('h', [0])48>>> fcntl.ioctl(0, termios.TIOCGPGRP, buf, 1)49050>>> buf51array('h', [13341])52```5354#### `fcntl.flock(fd, op)`5556Выполняет операцию блокировки *op* над файловым дескриптором *fd* (также принимаются файловые объекты, предоставляющие метод [`fileno()`](https://python-all.ru/3.3/library/io.html#io.IOBase.fileno)). Подробнее см. в руководстве Unix *flock(2)*. (В некоторых системах эта функция эмулируется с помощью `fcntl()`.)5758#### `fcntl.lockf(fd, operation[, length[, start[, whence]]])`5960По сути, это обёртка над вызовами блокировки [`fcntl()`](https://python-all.ru/3.3/library/fcntl.html#fcntl.fcntl). *fd* – файловый дескриптор файла, который нужно заблокировать или разблокировать, а *operation* – одно из следующих значений:6162- `LOCK_UN` – разблокировать63- `LOCK_SH` – захватить разделяемую блокировку64- `LOCK_EX` – захватить исключительную блокировку6566Когда *operation* равно `LOCK_SH` или `LOCK_EX`, его можно также побитово объединить с `LOCK_NB`, чтобы избежать блокировки при захвате блокировки. Если используется `LOCK_NB` и блокировку не удаётся захватить, будет возбуждено [`OSError`](https://python-all.ru/3.3/library/exceptions.html#OSError), и у исключения будет атрибут *errno*, установленный в `EACCES` или `EAGAIN` (в зависимости от операционной системы; для переносимости следует проверять оба значения). По крайней мере, в некоторых системах `LOCK_EX` может использоваться только если файловый дескриптор ссылается на файл, открытый для записи.6768*length* – количество блокируемых байт, *start* – смещение в байтах, с которого начинается блокировка, относительно *whence*, а *whence* определяется так же, как в [`io.IOBase.seek()`](https://python-all.ru/3.3/library/io.html#io.IOBase.seek), а именно:6970- `0` – относительно начала файла ([`os.SEEK_SET`](https://python-all.ru/3.3/library/os.html#os.SEEK_SET))71- `1` – относительно текущей позиции буфера ([`os.SEEK_CUR`](https://python-all.ru/3.3/library/os.html#os.SEEK_CUR))72- `2` – относительно конца файла ([`os.SEEK_END`](https://python-all.ru/3.3/library/os.html#os.SEEK_END))7374Значение по умолчанию для *start* – 0, что означает начало от начала файла. Значение по умолчанию для *length* – 0, что означает блокировку до конца файла. Значение по умолчанию для *whence* также равно 0.7576Примеры (все на системе, совместимой с SVR4):7778```python79import struct, fcntl, os8081f = open(...)82rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NDELAY)8384lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)85rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata)86```8788Обратите внимание, что в первом примере переменная *rv* будет содержать целое число, а во втором – строку. Структура данных для переменной *lockdata* зависит от системы – поэтому использование вызова [`flock()`](https://python-all.ru/3.3/library/fcntl.html#fcntl.flock) может быть предпочтительнее.8990> **См. также**91>92> **Модуль [`os`](https://python-all.ru/3.3/library/os.html#module-os)**93>94> Если флаги блокировки95>96> [`O_SHLOCK`](https://python-all.ru/3.3/library/os.html#os.O_SHLOCK)97>98> и99>100> [`O_EXLOCK`](https://python-all.ru/3.3/library/os.html#os.O_EXLOCK)101>102> присутствуют в модуле103>104> [`os`](https://python-all.ru/3.3/library/os.html#module-os)105>106> (только на BSD), функция107>108> [`os.open()`](https://python-all.ru/3.3/library/os.html#os.open)109>110> предоставляет альтернативу функциям111>112> [`lockf()`](https://python-all.ru/3.3/library/fcntl.html#fcntl.lockf)113>114> и115>116> [`flock()`](https://python-all.ru/3.3/library/fcntl.html#fcntl.flock)117>118> .119