1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-23 23:32:16 +01:00
Files
archived-doc-ru/reference/ev/ev.xml
2026-01-18 22:20:57 +00:00

786 lines
30 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: b4fbf4434abeca44c58575ff3967e5640f7877d5 Maintainer: rjhdby Status: ready -->
<!-- Reviewed: no -->
<reference xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude" xml:id="class.ev" role="class">
<title>Класс Ev</title>
<titleabbrev>Ev</titleabbrev>
<partintro>
<!-- {{{ Ev intro -->
<section xml:id="ev.intro">
&reftitle.intro;
<simpara>
Класс EV — статический класс, который обеспечивает доступ к циклу
по умолчанию и некоторым общим операциям.
</simpara>
</section>
<!-- }}} -->
<section xml:id="ev.synopsis">
&reftitle.classsynopsis;
<!-- {{{ Synopsis -->
<classsynopsis>
<ooclass>
<classname>Ev</classname>
</ooclass>
<!-- {{{ Class synopsis -->
<classsynopsisinfo>
<ooclass>
<modifier>final</modifier>
<classname>Ev</classname>
</ooclass>
</classsynopsisinfo>
<!-- }}} -->
<classsynopsisinfo role="comment">&Constants;</classsynopsisinfo>
<!--{{{-->
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.flag-auto">Ev::FLAG_AUTO</varname>
<initializer>0</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.flag-noenv">Ev::FLAG_NOENV</varname>
<initializer>16777216</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.flag-forkcheck">Ev::FLAG_FORKCHECK</varname>
<initializer>33554432</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.flag-noinotify">Ev::FLAG_NOINOTIFY</varname>
<initializer>1048576</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.flag-signalfd">Ev::FLAG_SIGNALFD</varname>
<initializer>2097152</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.flag-nosigmask">Ev::FLAG_NOSIGMASK</varname>
<initializer>4194304</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.run-nowait">Ev::RUN_NOWAIT</varname>
<initializer>1</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.run-once">Ev::RUN_ONCE</varname>
<initializer>2</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.break-cancel">Ev::BREAK_CANCEL</varname>
<initializer>0</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.break-one">Ev::BREAK_ONE</varname>
<initializer>1</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.break-all">Ev::BREAK_ALL</varname>
<initializer>2</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.minpri">Ev::MINPRI</varname>
<initializer>-2</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.maxpri">Ev::MAXPRI</varname>
<initializer>2</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.read">Ev::READ</varname>
<initializer>1</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.write">Ev::WRITE</varname>
<initializer>2</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.timer">Ev::TIMER</varname>
<initializer>256</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.periodic">Ev::PERIODIC</varname>
<initializer>512</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.signal">Ev::SIGNAL</varname>
<initializer>1024</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.child">Ev::CHILD</varname>
<initializer>2048</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.stat">Ev::STAT</varname>
<initializer>4096</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.idle">Ev::IDLE</varname>
<initializer>8192</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.prepare">Ev::PREPARE</varname>
<initializer>16384</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.check">Ev::CHECK</varname>
<initializer>32768</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.embed">Ev::EMBED</varname>
<initializer>65536</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.custom">Ev::CUSTOM</varname>
<initializer>16777216</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.error">Ev::ERROR</varname>
<initializer>2147483648</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.backend-select">Ev::BACKEND_SELECT</varname>
<initializer>1</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.backend-poll">Ev::BACKEND_POLL</varname>
<initializer>2</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.backend-epoll">Ev::BACKEND_EPOLL</varname>
<initializer>4</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.backend-kqueue">Ev::BACKEND_KQUEUE</varname>
<initializer>8</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.backend-devpoll">Ev::BACKEND_DEVPOLL</varname>
<initializer>16</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.backend-port">Ev::BACKEND_PORT</varname>
<initializer>32</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.backend-all">Ev::BACKEND_ALL</varname>
<initializer>63</initializer>
</fieldsynopsis>
<fieldsynopsis>
<modifier>const</modifier>
<type>int</type>
<varname linkend="ev.constants.backend-mask">Ev::BACKEND_MASK</varname>
<initializer>65535</initializer>
</fieldsynopsis>
<!--}}}-->
<classsynopsisinfo role="comment">&Methods;</classsynopsisinfo>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('class.ev')/db:refentry/db:refsect1[@role='description']/descendant::db:methodsynopsis[1])"/>
</classsynopsis>
<!-- }}} -->
</section>
<!-- {{{ Ev constants -->
<section xml:id="ev.constants">
&reftitle.constants;
<para xml:id="ev.constants.loop-flags">
Флаги, передаваемые при создании цикла:
<!--{{{-->
<variablelist>
<varlistentry xml:id="ev.constants.flag-auto">
<term>
<constant>Ev::FLAG_AUTO</constant>
</term>
<listitem>
<simpara>
Задаёт флагам значение по умолчанию.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.flag-noenv">
<term>
<constant>Ev::FLAG_NOENV</constant>
</term>
<listitem>
<simpara>
Если флаг используется (или программа запускает флаг доступа пользователя setuid или флаг доступа группы setgid),
то модуль <literal>libev</literal> не смотрит на переменную окружения
<varname>LIBEV_FLAGS</varname>. Иначе (по умолчанию), если модуль нашёл переменную окружения
<varname>LIBEV_FLAGS</varname>, то он полностью переопределяет флаги.
Полезно для тестов производительности и поиска ошибок.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.flag-forkcheck">
<term>
<constant>Ev::FLAG_FORKCHECK</constant>
</term>
<listitem>
<simpara>
Заставляет модуль libev проверять ветвление в каждой итерации, вместо вызова
метода <methodname>EvLoop::fork</methodname> вручную. Это работает путём вызова
<literal>getpid()</literal> на каждой итерации цикла, и, таким образом, это может
замедлить работу цикла событий с большим количеством итераций цикла, но обычно не
сильно. Этот флаг нельзя переопределять или указывать в переменной среды
<varname>LIBEV_FLAGS</varname>.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.flag-noinotify">
<term>
<constant>Ev::FLAG_NOINOTIFY</constant>
</term>
<listitem>
<simpara>
Если этот флаг указали, модуль <literal>libev</literal>
не будет пытаться использовать API <literal>inotify</literal> для своих наблюдателей
<link xlink:href="&url.ev.stat;">ev_stat</link>
Флаг бывает полезным для сохранения файловых дескрипторов inotify,
иначе каждый цикл, который использует наблюдателей <literal>ev_stat</literal>,
будет потреблять один дескриптор <literal>inotify</literal>.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.flag-signalfd">
<term>
<constant>Ev::FLAG_SIGNALFD</constant>
</term>
<listitem>
<simpara>
Если флаг указали, модуль <literal>libev</literal>
будет пытаться использовать API <literal>signalfd</literal>
для своих наблюдателей
<link xlink:href="&url.ev.signal;">ev_signal</link>
<link xlink:href="&url.ev.child;">ev_child</link>).
API передаёт сигналы синхронно, что делает его быстрее и, возможно, даст
получить данные из очереди сигналов, а также упрощает обработку сигналов
через потоки, поскольку сигналы корректно блокируются в потоках.
<literal>Signalfd</literal> не используется по умолчанию.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.flag-nosigmask">
<term>
<constant>Ev::FLAG_NOSIGMASK</constant>
</term>
<listitem>
<simpara>
Если указали флаг, модуль <literal>libev</literal>
будет избегать изменения маски сигнала. В частности, это применяется, чтобы перед
получением сигнала убедиться, что он разблокирован.
</simpara>
<simpara>
Такое поведение полезно для обработки пользовательских сигналов или обработки
сигналов только конкретных потоков.
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
<!--}}}-->
<para xml:id="ev.constants.run-flags">
Флаги, которые передают в метод <methodname>Ev::run</methodname>
или метод <methodname>EvLoop::run</methodname>
<!--{{{-->
<variablelist>
<varlistentry xml:id="ev.constants.run-nowait">
<term>
<constant>Ev::RUN_NOWAIT</constant>
</term>
<listitem>
<simpara>
Означает, что цикл событий будет искать и обрабатывать новые события, а также любые
ожидающие выполнения события из них, но не будет ждать и блокировать процесс
в случае, если не было никаких событий и завершится после одной итерации цикла.
Это иногда полезно для опроса и обработки новых событий во время выполнения
длительных вычислений, сохраняя при этом возможность взаимодействия с программой.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.run-once">
<term>
<constant>Ev::RUN_ONCE</constant>
</term>
<listitem>
<simpara>
Означает, что цикл событий будет искать новые события (ожидая, если потребуется)
и обрабатывать эти и любые уже ожидающие события из них.
Цикл событий будет блокировать процесс, пока не поступит хотя бы одно новое событие
(им может оказаться внутреннее событие модуля libev, поэтому нет никакой гарантии, что будет
вызвана заданная callback-функция) и завершится после одной итерации цикла.
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
<!--}}}-->
<para xml:id="ev.constants.break-flags">
Флаги, которые передают
в метод <methodname>Ev::stop</methodname>
или метод <methodname>EvLoop::stop</methodname>
<!--{{{-->
<variablelist>
<varlistentry xml:id="ev.constants.break-cancel">
<term>
<constant>Ev::BREAK_CANCEL</constant>
</term>
<listitem>
<simpara>
Отмена операции прерывания.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.break-one">
<term>
<constant>Ev::BREAK_ONE</constant>
</term>
<listitem>
<simpara>
Возвращает самый глубокий запрос
метода <methodname>Ev::run</methodname>
(или метода <methodname>EvLoop::run</methodname>).
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.break-all">
<term>
<constant>Ev::BREAK_ALL</constant>
</term>
<listitem>
<simpara>
Завершает все вложенные вызовы
метода <methodname>Ev::run</methodname>
(или метода <methodname>EvLoop::run</methodname>).
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
<!--}}}-->
<para xml:id="ev.constants.watcher-pri">
Приоритеты наблюдателей:
<!--{{{-->
<variablelist>
<varlistentry xml:id="ev.constants.minpri">
<term>
<constant>Ev::MINPRI</constant>
</term>
<listitem>
<simpara>
Минимально допустимый приоритет наблюдателя.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.maxpri">
<term>
<constant>Ev::MAXPRI</constant>
</term>
<listitem>
<simpara>
Максимально допустимый приоритет наблюдателя.
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
<!--}}}-->
<para xml:id="ev.constants.watcher-revents">
Битовые маски (полученных) событий:
<!--{{{-->
<variablelist>
<varlistentry xml:id="ev.constants.read">
<term>
<constant>Ev::READ</constant>
</term>
<listitem>
<simpara>
Дескриптор файла в наблюдателе
<classname>EvIo</classname>
доступен для чтения.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.write">
<term>
<constant>Ev::WRITE</constant>
</term>
<listitem>
<simpara>
Дескриптор файла в наблюдателе
<classname>EvIo</classname>
доступен для записи.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.timer">
<term>
<constant>Ev::TIMER</constant>
</term>
<listitem>
<simpara>
<classname>EvTimer</classname>
наблюдает за превышением лимита времени.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.periodic">
<term>
<constant>Ev::PERIODIC</constant>
</term>
<listitem>
<simpara>
<classname>EvPeriodic</classname>
наблюдает за превышением лимита времени.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.signal">
<term>
<constant>Ev::SIGNAL</constant>
</term>
<listitem>
<simpara>
Сигнал, который указали в методе
<methodname>EvSignal::__construct</methodname>,
получен.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.child">
<term>
<constant>Ev::CHILD</constant>
</term>
<listitem>
<simpara>
Идентификатор <parameter>pid</parameter>, который
указали в методе
<methodname>EvChild::__construct</methodname>,
получил изменение статуса.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.stat">
<term>
<constant>Ev::STAT</constant>
</term>
<listitem>
<simpara>
Путь, который указали в наблюдателе
<classname>EvStat</classname>,
поменял свои атрибуты.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.idle">
<term>
<constant>Ev::IDLE</constant>
</term>
<listitem>
<simpara>
Наблюдатель <classname>EvIdle</classname>
работает, когда остальные наблюдатели ничего не делают.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.prepare">
<term>
<constant>Ev::PREPARE</constant>
</term>
<listitem>
<simpara>
Все наблюдатели
<classname>EvPrepare</classname>
вызываются непосредственно перед запуском
метода <methodname>Ev::run</methodname>.
Поэтому наблюдатели
<classname>EvPrepare</classname>
последние наблюдатели, которые вызываются перед тем,
как цикл событий переходит в режим сна или опрашивает новые события.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.check">
<term>
<constant>Ev::CHECK</constant>
</term>
<listitem>
<simpara>
Все наблюдатели
<classname>EvCheck</classname>
помещаются в очередь сразу после того, как
метод <methodname>Ev::run</methodname>
собрал новые события, но до того, как они вызовут какую-либо callback-функцию
для полученных событий.
Поэтому наблюдатели
<classname>EvCheck</classname>
будут вызваны раньше, чем любые другие наблюдатели с таким же
либо более низким приоритетом в этой итерации цикла событий.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.embed">
<term>
<constant>Ev::EMBED</constant>
</term>
<listitem>
<simpara>
Встроенный цикл событий, который задали в наблюдателе
<classname>EvEmbed</classname>,
требует к себе внимания.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.custom">
<term>
<constant>Ev::CUSTOM</constant>
</term>
<listitem>
<simpara>
Никогда не посылается (или иным образом используется) библиотекой
<literal>libev</literal>
самостоятельно, но может свободно использоваться пользователями
<literal>libev</literal>
для сигнализирующих наблюдателей (т. е. через метод
<methodname>EvWatcher::feed</methodname>
).
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.error">
<term>
<constant>Ev::ERROR</constant>
</term>
<listitem>
<simpara>
Произошла неизвестная ошибка и наблюдатель будет остановлен.
Ошибка могла произойти из-за некорректного запуска наблюдателя, потому что
модулю <literal>libev</literal>
не хватило памяти, дескриптор файла оказался закрытым
или возникла другая проблема.
Модуль <literal>Libev</literal>
считает такие ошибки ошибками приложения.
Дополнительные сведения даёт раздел
<link xlink:href="http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#ANATOMY_OF_A_WATCHER_CONTENT">Анатомия наблюдателей</link>
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
<!--}}}-->
<para xml:id="ev.constants.watcher-backends">
Флаги бэкенда:
<!--{{{-->
<variablelist>
<varlistentry xml:id="ev.constants.backend-select">
<term>
<constant>Ev::BACKEND_SELECT</constant>
</term>
<listitem>
<simpara>
<literal>выбор бэкенда — select(2)</literal>
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.backend-poll">
<term>
<constant>Ev::BACKEND_POLL</constant>
</term>
<listitem>
<simpara>
<literal>опрос бэкенда — poll(2)</literal>
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.backend-epoll">
<term>
<constant>Ev::BACKEND_EPOLL</constant>
</term>
<listitem>
<simpara>
Специфичный для Linux бэкенд
<literal>epoll(7)</literal>
для ядер до и после 2.6.9
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.backend-kqueue">
<term>
<constant>Ev::BACKEND_KQUEUE</constant>
</term>
<listitem>
<simpara>
<literal>kqueue</literal>
бэкенд большинства BSD-систем.
Наблюдатель <classname>EvEmbed</classname>
можно использовать для вставки одного цикла (с бэкендом kqueue)
в другой. Например, можно попытаться создать цикл событий
с бэкендом <literal>kqueue</literal>
и использовать его только для сокетов.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.backend-devpoll">
<term>
<constant>Ev::BACKEND_DEVPOLL</constant>
</term>
<listitem>
<simpara>
Бэкенд Solaris 8. Пока не реализовали.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.backend-port">
<term>
<constant>Ev::BACKEND_PORT</constant>
</term>
<listitem>
<simpara>
Механизм порта событий с хорошим масштабированием в Solaris 10.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.backend-all">
<term>
<constant>Ev::BACKEND_ALL</constant>
</term>
<listitem>
<simpara>
Пробовать все бэкенды (кроме испорченных).
Не рекомендуется использовать напрямую.
Тут необходимо использовать побитовые операции
(т. е. <constant>Ev::BACKEND_ALL</constant> &amp; ~ <constant>Ev::BACKEND_KQUEUE</constant>).
Вызывать метод <methodname>Ev::recommendedBackends</methodname>, или не задавать никакого бэкенда.
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="ev.constants.backend-mask">
<term>
<constant>Ev::BACKEND_MASK</constant>
</term>
<listitem>
<simpara>
Не бэкенд, но маска для выбора всех битов бэкендов из значения
<parameter>flags</parameter>, чтобы
исключить какие-либо бэкенды
(т. е. когда модифицируется переменная окружения
<varname>LIBEV_FLAGS</varname>).
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
<!--}}}-->
<note xmlns="http://docbook.org/ns/docbook">
<simpara>
Для цикла по умолчанию во время фазы инициализации
модуля <literal>Ev</literal> регистрируется вызов
<link xlink:href="&url.ev.loop;">&gt;ev_loop_fork</link>
через <literal>pthread_atfork</literal> (если такой имеется).
</simpara>
</note>
<note xmlns="http://docbook.org/ns/docbook">
<simpara>
Есть методы, которые разрешают получить доступ к <emphasis>циклу событий по
умолчанию</emphasis> в классе <classname>Ev</classname> (например,
методы <methodname>Ev::iteration</methodname>, <methodname>Ev::depth</methodname>
и т. д.). Для <emphasis>пользовательских циклов</emphasis> (которые создали методом
<methodname>EvLoop::__construct</methodname>) эти значения могут быть доступны
через соответствующие свойства и методы класса <classname>EvLoop</classname>.
</simpara>
<simpara>
Экземпляр цикла событий по умолчанию можно извлечь
методом <methodname>EvLoop::defaultLoop</methodname>.
</simpara>
</note>
</section>
<!-- }}} -->
</partintro>
&reference.ev.entities.ev;
</reference>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->