select.md
1> **Источник:** https://python-all.ru/3.15/library/select.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `select` – Ожидание завершения ввода-вывода89---1011Этот модуль предоставляет доступ к функциям `select()` и `poll()`, доступным в большинстве операционных систем, `devpoll()` – на Solaris и производных, `epoll()` – на Linux 2.5+ и `kqueue()` – на большинстве BSD. Обратите внимание: в Windows он работает только с сокетами; в других ОС он также работает с другими типами файлов (в частности, в Unix – с каналами). Его нельзя использовать для обычных файлов, чтобы определить, увеличился ли файл с момента последнего чтения.1213> **Примечание**14>15> Модуль [`selectors`](https://python-all.ru/3.15/library/selectors.html#module-selectors) предоставляет высокоуровневую и эффективную мультиплексацию ввода-вывода, построенную на примитивах модуля `select`. Пользователям рекомендуется использовать модуль `selectors`, если только им не требуется точный контроль над используемыми низкоуровневыми примитивами ОС.1617[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.1819Этот модуль не работает или недоступен на WebAssembly. Подробнее см. [платформы WebAssembly](https://python-all.ru/3.15/library/intro.html#wasm-availability).2021Модуль определяет следующее:2223#### `exception select.error`2425Устаревший псевдоним [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError).2627Изменено в версии 3.3: В соответствии с [**PEP 3151**](https://python-all.ru/3.15/library/select.html) этот класс стал псевдонимом [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError).2829#### `select.devpoll()`3031Возвращает объект `/dev/poll` опроса; см. раздел [Объекты опроса /dev/poll](https://python-all.ru/3.15/library/select.html#devpoll-objects) ниже для получения информации о методах, поддерживаемых объектами devpoll.3233Объекты `devpoll()` привязаны к количеству файловых дескрипторов, разрешённых на момент создания. Если программа уменьшает это значение, `devpoll()` завершится ошибкой. Если программа увеличивает это значение, `devpoll()` может вернуть неполный список активных файловых дескрипторов.3435Новый файловый дескриптор является [ненаследуемым](https://python-all.ru/3.15/library/os.html#fd-inheritance).3637Добавлено в версии 3.3.3839Изменено в версии 3.4: Новый файловый дескриптор теперь не наследуется.4041[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Solaris.4243#### `select.epoll(sizehint=-1, flags=0)`4445Возвращает объект опроса по фронту, который можно использовать как интерфейс с триггером по фронту или уровню для событий ввода-вывода.4647*sizehint* сообщает epoll ожидаемое количество регистрируемых событий. Он должен быть положительным, или `-1`, чтобы использовать значение по умолчанию. Он используется только в старых системах, где *[epoll\_create1(2)](https://python-all.ru/3.15/library/select.html)* недоступен; в противном случае он не имеет эффекта (хотя его значение всё равно проверяется).4849Параметр *flags* устарел и полностью игнорируется. Однако, если он указан, его значение должно быть `0` или `select.EPOLL_CLOEXEC`, иначе возбуждается `OSError`.5051См. раздел [Объекты опроса с триггером по фронту и уровню (epoll)](https://python-all.ru/3.15/library/select.html#epoll-objects) ниже для получения информации о методах, поддерживаемых объектами epoll.5253Объекты `epoll` поддерживают протокол менеджера контекста: при использовании в инструкции [`with`](https://python-all.ru/3.15/reference/compound_stmts.html#with) новый файловый дескриптор автоматически закрывается в конце блока.5455Новый файловый дескриптор является [ненаследуемым](https://python-all.ru/3.15/library/os.html#fd-inheritance).5657Изменено в версии 3.3: Добавлен параметр *flags*.5859Изменено в версии 3.4: Добавлена поддержка инструкции [`with`](https://python-all.ru/3.15/reference/compound_stmts.html#with). Теперь новый файловый дескриптор является ненаследуемым.6061Устарело с версии 3.4: Параметр *flags*. Теперь по умолчанию используется `select.EPOLL_CLOEXEC`. Используйте [`os.set_inheritable()`](https://python-all.ru/3.15/library/os.html#os.set_inheritable), чтобы сделать файловый дескриптор наследуемым.6263Изменено в версии 3.15: при сборке CPython эта функция может быть отключена с помощью [`--disable-epoll`](https://python-all.ru/3.15/using/configure.html#cmdoption-disable-epoll).6465[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 2.5.44.6667#### `select.poll()`6869Возвращает объект опроса, который поддерживает регистрацию и отмену регистрации файловых дескрипторов, а затем их опрос на предмет событий ввода-вывода; см. раздел [Объекты опроса](https://python-all.ru/3.15/library/select.html#poll-objects) ниже для получения информации о методах, поддерживаемых объектами опроса.7071[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Unix.7273#### `select.kqueue()`7475Возвращает объект очереди ядра; см. раздел [Объекты Kqueue](https://python-all.ru/3.15/library/select.html#kqueue-objects) ниже для получения информации о методах, поддерживаемых объектами kqueue.7677Новый файловый дескриптор является [ненаследуемым](https://python-all.ru/3.15/library/os.html#fd-inheritance).7879Изменено в версии 3.4: Новый файловый дескриптор теперь не наследуется.8081[Доступность](https://python-all.ru/3.15/library/intro.html#availability): BSD, macOS.8283#### `select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)`8485Возвращает объект события ядра; см. раздел [Объекты Kevent](https://python-all.ru/3.15/library/select.html#kevent-objects) ниже для получения информации о методах, поддерживаемых объектами kevent.8687[Доступность](https://python-all.ru/3.15/library/intro.html#availability): BSD, macOS.8889#### `select.select(rlist, wlist, xlist, timeout=None)`9091Это простой интерфейс к системному вызову `select()` Unix. Первые три аргумента – это итерируемые объекты «ожидаемых объектов»: целые числа, представляющие файловые дескрипторы, или объекты с методом без параметров с именем [`fileno()`](https://python-all.ru/3.15/library/io.html#io.IOBase.fileno), возвращающим такое целое число:9293- *rlist*: ожидать готовности к чтению94- *wlist*: ожидать готовности к записи95- *xlist*: ожидать «исключительного условия» (см. справочную страницу для того, что ваша система считает таким условием)9697Пустые итерируемые объекты допускаются, но принятие трёх пустых итерируемых объектов зависит от платформы. (Известно, что работает на Unix, но не на Windows.) Необязательный аргумент *timeout* задаёт тайм-аут в секундах; он может быть нецелым числом для указания долей секунды. Когда аргумент *timeout* опущен или равен `None`, функция блокируется, пока хотя бы один файловый дескриптор не будет готов. Значение тайм-аута, равное нулю, задаёт опрос и никогда не блокирует.9899Возвращаемое значение – тройка списков готовых объектов: подмножества первых трех аргументов. Когда тайм-аут истекает без готовности файлового дескриптора, возвращаются три пустых списка.100101Среди допустимых типов объектов в итерируемых – [файловые объекты](https://python-all.ru/3.15/glossary.html#term-file-object) Python (например, `sys.stdin` или объекты, возвращаемые [`open()`](https://python-all.ru/3.15/library/functions.html#open) или [`os.popen()`](https://python-all.ru/3.15/library/os.html#os.popen)), сокетные объекты, возвращаемые [`socket.socket()`](https://python-all.ru/3.15/library/socket.html#socket.socket). Вы также можете самостоятельно определить *класс-обёртку*, если он имеет подходящий метод [`fileno()`](https://python-all.ru/3.15/library/io.html#io.IOBase.fileno) (который действительно возвращает файловый дескриптор, а не случайное целое число).102103> **Примечание**104>105> Файловые объекты в Windows недопустимы, но сокеты – да. В Windows базовая функция `select()` предоставляется библиотекой WinSock и не обрабатывает файловые дескрипторы, не происходящие из WinSock.106107Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. [**PEP 475**](https://python-all.ru/3.15/library/select.html) для обоснования), вместо вызова [`InterruptedError`](https://python-all.ru/3.15/library/exceptions.html#InterruptedError).108109Изменено в версии 3.15: Принимает любое вещественное число в качестве *timeout*, а не только целое число или число с плавающей точкой.110111#### `select.PIPE_BUF`112113Минимальное количество байтов, которое можно записать без блокировки в канал, когда канал был сообщен как готовый к записи с помощью [`select()`](https://python-all.ru/3.15/library/select.html#select.select), `poll()` или другого интерфейса в этом модуле. Это не относится к другим видам файлоподобных объектов, таким как сокеты.114115Это значение гарантируется POSIX равным не менее 512.116117[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Unix118119Добавлено в версии 3.2.120121## `/dev/poll` объекты опроса122123Solaris и его производные имеют `/dev/poll`. В то время как `select()` является *O*(*наибольший файловый дескриптор*) и `poll()` является *O*(*количество файловых дескрипторов*), `/dev/poll` является *O*(*активные файловые дескрипторы*).124125Поведение `/dev/poll` очень близко к стандартному объекту `poll()`.126127#### `devpoll.close()`128129Закрывает файловый дескриптор объекта опроса.130131Добавлено в версии 3.4.132133#### `devpoll.closed`134135`True` если объект опроса закрыт.136137Добавлено в версии 3.4.138139#### `devpoll.fileno()`140141Возвращает номер файлового дескриптора объекта опроса.142143Добавлено в версии 3.4.144145#### `devpoll.register(fd[, eventmask])`146147Регистрирует файловый дескриптор в объекте опроса. Последующие вызовы метода [`poll()`](https://python-all.ru/3.15/library/select.html#select.poll) будут проверять, есть ли у файлового дескриптора ожидающие события ввода-вывода. *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.15/library/io.html#io.IOBase.fileno), возвращающим целое число. Файловые объекты реализуют `fileno()`, поэтому их тоже можно использовать в качестве аргумента.148149*eventmask* – необязательная битовая маска, описывающая тип событий, которые требуется проверять. Константы те же, что и для объекта `poll()`. Значение по умолчанию представляет собой комбинацию констант `POLLIN`, `POLLPRI` и `POLLOUT`.150151> **Предупреждение**152>153> Регистрация уже зарегистрированного файлового дескриптора не является ошибкой, но результат не определен. Правильным действием будет сначала отменить регистрацию или изменить его. Это важное отличие от `poll()`.154155#### `devpoll.modify(fd[, eventmask])`156157Этот метод выполняет [`unregister()`](https://python-all.ru/3.15/library/select.html#select.devpoll.unregister) с последующим [`register()`](https://python-all.ru/3.15/library/select.html#select.devpoll.register). Он (немного) эффективнее, чем делать то же самое явно.158159#### `devpoll.unregister(fd)`160161Удаляет файловый дескриптор, отслеживаемый объектом опроса. Как и метод [`register()`](https://python-all.ru/3.15/library/select.html#select.devpoll.register), *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.15/library/io.html#io.IOBase.fileno), возвращающим целое число.162163Попытка удалить файловый дескриптор, который никогда не был зарегистрирован, безопасно игнорируется.164165#### `devpoll.poll([timeout])`166167Опрашивает набор зарегистрированных файловых дескрипторов и возвращает возможно пустой список, содержащий кортежи из двух элементов `(fd, event)` для дескрипторов, у которых есть события или ошибки. *fd* – это файловый дескриптор, а *event* – битовая маска с установленными битами для сообщенных событий этого дескриптора: `POLLIN` – ожидание ввода, `POLLOUT` – указывает, что в дескриптор можно писать, и так далее. Пустой список означает, что вызов завершился по тайм-ауту и ни у одного файлового дескриптора не было событий. Если указан *timeout*, он задает время в миллисекундах, в течение которого система будет ждать событий перед возвратом. Если *timeout* опущен, равен -1 или [`None`](https://python-all.ru/3.15/library/constants.html#None), вызов будет блокироваться до появления события для этого объекта poll.168169Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. [**PEP 475**](https://python-all.ru/3.15/library/select.html) для обоснования), вместо вызова [`InterruptedError`](https://python-all.ru/3.15/library/exceptions.html#InterruptedError).170171Изменено в версии 3.15: Принимает любое вещественное число в качестве *timeout*, а не только целое число или число с плавающей точкой.172173## Объекты опроса с триггерами по переднему и уровневому фронту (epoll)174175> [https://linux.die.net/man/4/epoll](https://python-all.ru/3.15/library/select.html)176>177> *eventmask* – это битовая маска, использующая следующие константы:178>179> | Константа | Значение |180> | --- | --- |181> | `EPOLLIN` | Доступен для чтения. |182> | `EPOLLOUT` | Доступен для записи. |183> | `EPOLLPRI` | Срочные данные для чтения. |184> | `EPOLLERR` | На связанном fd произошла ошибка. |185> | `EPOLLHUP` | На связанном fd произошел разрыв соединения. |186> | `EPOLLET` | Устанавливает поведение триггера по переднему фронту; по умолчанию – поведение триггера по уровню. |187> | `EPOLLONESHOT` | Устанавливает однократное поведение. После извлечения одного события файловый дескриптор внутренне отключается. |188> | `EPOLLEXCLUSIVE` | Пробуждает только один объект epoll при событии на связанном fd. По умолчанию (если этот флаг не установлен) пробуждаются все объекты epoll, ожидающие на этом fd. |189> | `EPOLLRDHUP` | Потоковый сокет: удаленная сторона закрыла соединение или завершила записывающую половину соединения. |190> | `EPOLLRDNORM` | Эквивалентно `EPOLLIN` |191> | `EPOLLRDBAND` | Полоса приоритетных данных доступна для чтения. |192> | `EPOLLWRNORM` | Эквивалентно `EPOLLOUT`. |193> | `EPOLLWRBAND` | Приоритетные данные могут быть записаны. |194> | `EPOLLMSG` | Игнорируется. |195> | `EPOLLWAKEUP` | Предотвращает ожидание во время ожидания событий. |196>197> Добавлено в версии 3.6: `EPOLLEXCLUSIVE` был добавлен. Поддерживается только ядром Linux 4.5 и новее.198>199> Добавлено в версии 3.14: `EPOLLWAKEUP` был добавлен. Поддерживается только ядром Linux 3.5 и новее.200201#### `epoll.close()`202203Закрывает управляющий файловый дескриптор объекта epoll.204205#### `epoll.closed`206207`True`, если объект epoll закрыт.208209#### `epoll.fileno()`210211Возвращает номер файлового дескриптора управляющего fd.212213#### `epoll.fromfd(fd)`214215Создает объект epoll из заданного файлового дескриптора.216217#### `epoll.register(fd[, eventmask])`218219Регистрирует файловый дескриптор *fd* в объекте epoll.220221#### `epoll.modify(fd, eventmask)`222223Изменяет зарегистрированный файловый дескриптор *fd*.224225#### `epoll.unregister(fd)`226227Удаляет зарегистрированный файловый дескриптор из объекта epoll.228229Изменено в версии 3.9: Метод больше не игнорирует ошибку [`EBADF`](https://python-all.ru/3.15/library/errno.html#errno.EBADF).230231#### `epoll.poll(timeout=None, maxevents=-1)`232233Ожидание событий. Если задан *timeout*, он определяет время ожидания в секундах (может быть нецелым), в течение которого система будет ждать события перед возвратом.234235Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. [**PEP 475**](https://python-all.ru/3.15/library/select.html) для обоснования), вместо вызова [`InterruptedError`](https://python-all.ru/3.15/library/exceptions.html#InterruptedError).236237Изменено в версии 3.15: Принимает любое вещественное число в качестве *timeout*, а не только целое число или число с плавающей точкой.238239## Объекты опроса (polling)240241Системный вызов `poll()`, поддерживаемый в большинстве Unix-систем, обеспечивает лучшую масштабируемость для сетевых серверов, обслуживающих одновременно множество клиентов. `poll()` масштабируется лучше, поскольку системный вызов требует только перечисления интересующих файловых дескрипторов, тогда как `select()` строит битовую маску, устанавливает биты для интересующих fd, а затем всю битовую маску нужно снова линейно сканировать. `select()` имеет сложность *O*(*наибольший файловый дескриптор*), тогда как `poll()` – *O*(*количество файловых дескрипторов*).242243#### `poll.register(fd[, eventmask])`244245Регистрирует файловый дескриптор в объекте опроса. Последующие вызовы метода [`poll()`](https://python-all.ru/3.15/library/select.html#select.poll) будут проверять, есть ли у файлового дескриптора ожидающие события ввода-вывода. *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.15/library/io.html#io.IOBase.fileno), возвращающим целое число. Файловые объекты реализуют `fileno()`, поэтому их тоже можно использовать в качестве аргумента.246247*eventmask* – необязательная битовая маска, описывающая типы событий для проверки. Может быть комбинацией констант `POLLIN`, `POLLPRI` и `POLLOUT`, описанных в таблице ниже. Если не указана, по умолчанию проверяются все три типа событий.248249| Константа | Значение |250| --- | --- |251| `POLLIN` | Есть данные для чтения. |252| `POLLPRI` | Есть срочные данные для чтения. |253| `POLLOUT` | Готов к выводу: запись не будет блокироваться. |254| `POLLERR` | Ошибка какого-либо рода. |255| `POLLHUP` | Разъединение. |256| `POLLRDHUP` | Удаленный сокет потока закрыл соединение или завершил запись на своей стороне. |257| `POLLNVAL` | Недопустимый запрос: дескриптор не открыт. |258259Регистрация уже зарегистрированного файлового дескриптора не является ошибкой и имеет тот же эффект, как если бы дескриптор был зарегистрирован ровно один раз.260261#### `poll.modify(fd, eventmask)`262263Изменяет уже зарегистрированный fd. Это имеет тот же эффект, что и `register(fd, eventmask)`. Попытка изменить файловый дескриптор, который никогда не был зарегистрирован, приводит к возбуждению исключения [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError) с errno `ENOENT`.264265#### `poll.unregister(fd)`266267Удаляет файловый дескриптор, отслеживаемый объектом опроса. Как и метод [`register()`](https://python-all.ru/3.15/library/select.html#select.poll.register), *fd* может быть целым числом или объектом с методом [`fileno()`](https://python-all.ru/3.15/library/io.html#io.IOBase.fileno), возвращающим целое число.268269Попытка удалить файловый дескриптор, который никогда не был зарегистрирован, приводит к возбуждению исключения [`KeyError`](https://python-all.ru/3.15/library/exceptions.html#KeyError).270271#### `poll.poll([timeout])`272273Опрашивает набор зарегистрированных файловых дескрипторов и возвращает, возможно, пустой список, содержащий `(fd, event)` кортежи из двух элементов для дескрипторов, по которым есть события или ошибки. *fd* – файловый дескриптор, а *event* – битовая маска с установленными битами для сообщаемых событий этого дескриптора: `POLLIN` для ожидания ввода, `POLLOUT` для указания, что в дескриптор можно писать, и так далее. Пустой список означает, что вызов завершился по таймауту и ни у одного файлового дескриптора не было событий. Если указан *timeout*, он задает время ожидания в миллисекундах, в течение которого система будет ожидать события перед возвратом. Если *timeout* опущен, отрицателен или равен [`None`](https://python-all.ru/3.15/library/constants.html#None), вызов будет блокироваться до появления события для этого объекта опроса.274275Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. [**PEP 475**](https://python-all.ru/3.15/library/select.html) для обоснования), вместо вызова [`InterruptedError`](https://python-all.ru/3.15/library/exceptions.html#InterruptedError).276277Изменено в версии 3.15: Принимает любое вещественное число в качестве *timeout*, а не только целое число или число с плавающей точкой. Если доступна функция `ppoll()`, *timeout* имеет разрешение `1` нс (`1e-6` мс) вместо `1` мс.278279## Объекты Kqueue280281#### `kqueue.close()`282283Закрывает файловый дескриптор управления объекта kqueue.284285#### `kqueue.closed`286287`True`, если объект kqueue закрыт.288289#### `kqueue.fileno()`290291Возвращает номер файлового дескриптора управляющего fd.292293#### `kqueue.fromfd(fd)`294295Создаёт объект kqueue из заданного файлового дескриптора.296297#### `kqueue.control(changelist, max_events[, timeout]) → eventlist`298299Низкоуровневый интерфейс к kevent300301- changelist должен быть итерируемым объектом, содержащим объекты kevent, или `None`302- max\_events должен быть 0 или положительным целым числом303- время ожидания в секундах (допускаются нецелые числа); по умолчанию `None`, ждать бесконечно304305Изменено в версии 3.5: Функция теперь повторяется с пересчитанным тайм-аутом при прерывании сигналом, за исключением случая, когда обработчик сигнала вызывает исключение (см. [**PEP 475**](https://python-all.ru/3.15/library/select.html) для обоснования), вместо вызова [`InterruptedError`](https://python-all.ru/3.15/library/exceptions.html#InterruptedError).306307Изменено в версии 3.15: Принимает любое вещественное число в качестве *timeout*, а не только целое число или число с плавающей точкой.308309## Объекты kevent310311[https://man.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2](https://python-all.ru/3.15/library/select.html)312313#### `kevent.ident`314315Значение, используемое для идентификации события. Интерпретация зависит от фильтра, но обычно это файловый дескриптор. В конструкторе ident может быть либо целым числом, либо объектом с методом [`fileno()`](https://python-all.ru/3.15/library/io.html#io.IOBase.fileno). kevent хранит целое число внутри.316317#### `kevent.filter`318319Имя фильтра ядра.320321| Константа | Значение |322| --- | --- |323| `KQ_FILTER_READ` | Принимает дескриптор и возвращает результат, когда doступны данные для чтения. |324| `KQ_FILTER_WRITE` | Принимает дескриптор и возвращает результат, когда doступны данные для записи. |325| `KQ_FILTER_AIO` | Запросы AIO. |326| `KQ_FILTER_VNODE` | Возвращает результат, когда происходит одно или несколько запрошенных событий, отслеживаемых в *fflag*. |327| `KQ_FILTER_PROC` | Отслеживает события для идентификатора процесса. |328| `KQ_FILTER_NETDEV` | Отслеживает события на сетевом устройстве (недоступно в macOS). |329| `KQ_FILTER_SIGNAL` | Возвращает результат, когда отслеживаемый сигнал doставляется процессу. |330| `KQ_FILTER_TIMER` | Устанавливает произвольный таймер. |331332#### `kevent.flags`333334Действие фильтра.335336| Константа | Значение |337| --- | --- |338| `KQ_EV_ADD` | Добавляет или изменяет событие. |339| `KQ_EV_DELETE` | Удаляет событие из очереди. |340| `KQ_EV_ENABLE` | Разрешает control() возвращать событие. |341| `KQ_EV_DISABLE` | Отключает событие. |342| `KQ_EV_ONESHOT` | Удаляет событие после первого срабатывания. |343| `KQ_EV_CLEAR` | Сбрасывает состояние после извлечения события. |344| `KQ_EV_SYSFLAGS` | Внутреннее событие. |345| `KQ_EV_FLAG1` | Внутреннее событие. |346| `KQ_EV_EOF` | Специфическое для фильтра условие EOF. |347| `KQ_EV_ERROR` | Смотрите возвращаемые значения. |348349#### `kevent.fflags`350351Специфические для фильтра флаги.352353`KQ_FILTER_READ` и `KQ_FILTER_WRITE` флаги фильтра:354355| Константа | Значение |356| --- | --- |357| `KQ_NOTE_LOWAT` | Нижний водяной знак буфера сокета. |358359`KQ_FILTER_VNODE` флаги фильтра:360361| Константа | Значение |362| --- | --- |363| `KQ_NOTE_DELETE` | Была вызвана функция *unlink()*. |364| `KQ_NOTE_WRITE` | Произошла запись. |365| `KQ_NOTE_EXTEND` | Файл был расширен. |366| `KQ_NOTE_ATTRIB` | Был изменён атрибут. |367| `KQ_NOTE_LINK` | Количество ссылок изменилось. |368| `KQ_NOTE_RENAME` | Файл был переименован. |369| `KQ_NOTE_REVOKE` | Доступ к файлу был отозван. |370371`KQ_FILTER_PROC` флаги фильтра:372373| Константа | Значение |374| --- | --- |375| `KQ_NOTE_EXIT` | Процесс завершился. |376| `KQ_NOTE_FORK` | Процесс вызвал *fork()*. |377| `KQ_NOTE_EXEC` | Процесс запустил новый процесс. |378| `KQ_NOTE_PCTRLMASK` | Внутренний флаг фильтра. |379| `KQ_NOTE_PDATAMASK` | Внутренний флаг фильтра. |380| `KQ_NOTE_TRACK` | Отслеживает процесс после вызова *fork()*. |381| `KQ_NOTE_CHILD` | Возвращается для дочернего процесса для *NOTE\_TRACK*. |382| `KQ_NOTE_TRACKERR` | Не удалось присоединиться к дочернему процессу. |383384`KQ_FILTER_NETDEV` флаги фильтра (недоступны в macOS):385386| Константа | Значение |387| --- | --- |388| `KQ_NOTE_LINKUP` | Соединение активно. |389| `KQ_NOTE_LINKDOWN` | Соединение неактивно. |390| `KQ_NOTE_LINKINV` | Состояние соединения некорректно. |391392#### `kevent.data`393394Данные, специфичные для фильтра.395396#### `kevent.udata`397398Пользовательское значение.399