17db96d56Sopenharmony_ci:mod:`select` --- Waiting for I/O completion
27db96d56Sopenharmony_ci============================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: select
57db96d56Sopenharmony_ci   :synopsis: Wait for I/O completion on multiple streams.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci--------------
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ciThis module provides access to the :c:func:`select` and :c:func:`poll` functions
107db96d56Sopenharmony_ciavailable in most operating systems, :c:func:`devpoll` available on
117db96d56Sopenharmony_ciSolaris and derivatives, :c:func:`epoll` available on Linux 2.5+ and
127db96d56Sopenharmony_ci:c:func:`kqueue` available on most BSD.
137db96d56Sopenharmony_ciNote that on Windows, it only works for sockets; on other operating systems,
147db96d56Sopenharmony_ciit also works for other file types (in particular, on Unix, it works on pipes).
157db96d56Sopenharmony_ciIt cannot be used on regular files to determine whether a file has grown since
167db96d56Sopenharmony_ciit was last read.
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ci.. note::
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci   The :mod:`selectors` module allows high-level and efficient I/O
217db96d56Sopenharmony_ci   multiplexing, built upon the :mod:`select` module primitives. Users are
227db96d56Sopenharmony_ci   encouraged to use the :mod:`selectors` module instead, unless they want
237db96d56Sopenharmony_ci   precise control over the OS-level primitives used.
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci.. include:: ../includes/wasm-notavail.rst
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ciThe module defines the following:
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci.. exception:: error
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci   A deprecated alias of :exc:`OSError`.
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci   .. versionchanged:: 3.3
357db96d56Sopenharmony_ci      Following :pep:`3151`, this class was made an alias of :exc:`OSError`.
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ci.. function:: devpoll()
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci   (Only supported on Solaris and derivatives.)  Returns a ``/dev/poll``
417db96d56Sopenharmony_ci   polling object; see section :ref:`devpoll-objects` below for the
427db96d56Sopenharmony_ci   methods supported by devpoll objects.
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ci   :c:func:`devpoll` objects are linked to the number of file
457db96d56Sopenharmony_ci   descriptors allowed at the time of instantiation. If your program
467db96d56Sopenharmony_ci   reduces this value, :c:func:`devpoll` will fail. If your program
477db96d56Sopenharmony_ci   increases this value, :c:func:`devpoll` may return an
487db96d56Sopenharmony_ci   incomplete list of active file descriptors.
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci   The new file descriptor is :ref:`non-inheritable <fd_inheritance>`.
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ci   .. versionadded:: 3.3
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci   .. versionchanged:: 3.4
557db96d56Sopenharmony_ci      The new file descriptor is now non-inheritable.
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci.. function:: epoll(sizehint=-1, flags=0)
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci   (Only supported on Linux 2.5.44 and newer.) Return an edge polling object,
607db96d56Sopenharmony_ci   which can be used as Edge or Level Triggered interface for I/O
617db96d56Sopenharmony_ci   events.
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci   *sizehint* informs epoll about the expected number of events to be
647db96d56Sopenharmony_ci   registered.  It must be positive, or ``-1`` to use the default. It is only
657db96d56Sopenharmony_ci   used on older systems where :c:func:`epoll_create1` is not available;
667db96d56Sopenharmony_ci   otherwise it has no effect (though its value is still checked).
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci   *flags* is deprecated and completely ignored.  However, when supplied, its
697db96d56Sopenharmony_ci   value must be ``0`` or ``select.EPOLL_CLOEXEC``, otherwise ``OSError`` is
707db96d56Sopenharmony_ci   raised.
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci   See the :ref:`epoll-objects` section below for the methods supported by
737db96d56Sopenharmony_ci   epolling objects.
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci   ``epoll`` objects support the context management protocol: when used in a
767db96d56Sopenharmony_ci   :keyword:`with` statement, the new file descriptor is automatically closed
777db96d56Sopenharmony_ci   at the end of the block.
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci   The new file descriptor is :ref:`non-inheritable <fd_inheritance>`.
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci   .. versionchanged:: 3.3
827db96d56Sopenharmony_ci      Added the *flags* parameter.
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ci   .. versionchanged:: 3.4
857db96d56Sopenharmony_ci      Support for the :keyword:`with` statement was added.
867db96d56Sopenharmony_ci      The new file descriptor is now non-inheritable.
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci   .. deprecated:: 3.4
897db96d56Sopenharmony_ci      The *flags* parameter.  ``select.EPOLL_CLOEXEC`` is used by default now.
907db96d56Sopenharmony_ci      Use :func:`os.set_inheritable` to make the file descriptor inheritable.
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci.. function:: poll()
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci   (Not supported by all operating systems.)  Returns a polling object, which
967db96d56Sopenharmony_ci   supports registering and unregistering file descriptors, and then polling them
977db96d56Sopenharmony_ci   for I/O events; see section :ref:`poll-objects` below for the methods supported
987db96d56Sopenharmony_ci   by polling objects.
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci.. function:: kqueue()
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_ci   (Only supported on BSD.)  Returns a kernel queue object; see section
1047db96d56Sopenharmony_ci   :ref:`kqueue-objects` below for the methods supported by kqueue objects.
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci   The new file descriptor is :ref:`non-inheritable <fd_inheritance>`.
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci   .. versionchanged:: 3.4
1097db96d56Sopenharmony_ci      The new file descriptor is now non-inheritable.
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_ci.. function:: kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci   (Only supported on BSD.)  Returns a kernel event object; see section
1157db96d56Sopenharmony_ci   :ref:`kevent-objects` below for the methods supported by kevent objects.
1167db96d56Sopenharmony_ci
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci.. function:: select(rlist, wlist, xlist[, timeout])
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci   This is a straightforward interface to the Unix :c:func:`select` system call.
1217db96d56Sopenharmony_ci   The first three arguments are iterables of 'waitable objects': either
1227db96d56Sopenharmony_ci   integers representing file descriptors or objects with a parameterless method
1237db96d56Sopenharmony_ci   named :meth:`~io.IOBase.fileno` returning such an integer:
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci   * *rlist*: wait until ready for reading
1267db96d56Sopenharmony_ci   * *wlist*: wait until ready for writing
1277db96d56Sopenharmony_ci   * *xlist*: wait for an "exceptional condition" (see the manual page for what
1287db96d56Sopenharmony_ci     your system considers such a condition)
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci   Empty iterables are allowed, but acceptance of three empty iterables is
1317db96d56Sopenharmony_ci   platform-dependent. (It is known to work on Unix but not on Windows.)  The
1327db96d56Sopenharmony_ci   optional *timeout* argument specifies a time-out as a floating point number
1337db96d56Sopenharmony_ci   in seconds.  When the *timeout* argument is omitted the function blocks until
1347db96d56Sopenharmony_ci   at least one file descriptor is ready.  A time-out value of zero specifies a
1357db96d56Sopenharmony_ci   poll and never blocks.
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ci   The return value is a triple of lists of objects that are ready: subsets of the
1387db96d56Sopenharmony_ci   first three arguments.  When the time-out is reached without a file descriptor
1397db96d56Sopenharmony_ci   becoming ready, three empty lists are returned.
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci   .. index::
1427db96d56Sopenharmony_ci      single: socket() (in module socket)
1437db96d56Sopenharmony_ci      single: popen() (in module os)
1447db96d56Sopenharmony_ci
1457db96d56Sopenharmony_ci   Among the acceptable object types in the iterables are Python :term:`file
1467db96d56Sopenharmony_ci   objects <file object>` (e.g. ``sys.stdin``, or objects returned by
1477db96d56Sopenharmony_ci   :func:`open` or :func:`os.popen`), socket objects returned by
1487db96d56Sopenharmony_ci   :func:`socket.socket`.  You may also define a :dfn:`wrapper` class yourself,
1497db96d56Sopenharmony_ci   as long as it has an appropriate :meth:`~io.IOBase.fileno` method (that
1507db96d56Sopenharmony_ci   really returns a file descriptor, not just a random integer).
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci   .. note::
1537db96d56Sopenharmony_ci
1547db96d56Sopenharmony_ci      .. index:: single: WinSock
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci      File objects on Windows are not acceptable, but sockets are.  On Windows,
1577db96d56Sopenharmony_ci      the underlying :c:func:`select` function is provided by the WinSock
1587db96d56Sopenharmony_ci      library, and does not handle file descriptors that don't originate from
1597db96d56Sopenharmony_ci      WinSock.
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci   .. versionchanged:: 3.5
1627db96d56Sopenharmony_ci      The function is now retried with a recomputed timeout when interrupted by
1637db96d56Sopenharmony_ci      a signal, except if the signal handler raises an exception (see
1647db96d56Sopenharmony_ci      :pep:`475` for the rationale), instead of raising
1657db96d56Sopenharmony_ci      :exc:`InterruptedError`.
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci
1687db96d56Sopenharmony_ci.. attribute:: PIPE_BUF
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ci   The minimum number of bytes which can be written without blocking to a pipe
1717db96d56Sopenharmony_ci   when the pipe has been reported as ready for writing by :func:`~select.select`,
1727db96d56Sopenharmony_ci   :func:`poll` or another interface in this module.  This doesn't apply
1737db96d56Sopenharmony_ci   to other kind of file-like objects such as sockets.
1747db96d56Sopenharmony_ci
1757db96d56Sopenharmony_ci   This value is guaranteed by POSIX to be at least 512.
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ci   .. availability:: Unix
1787db96d56Sopenharmony_ci
1797db96d56Sopenharmony_ci   .. versionadded:: 3.2
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci.. _devpoll-objects:
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci``/dev/poll`` Polling Objects
1857db96d56Sopenharmony_ci-----------------------------
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ciSolaris and derivatives have ``/dev/poll``. While :c:func:`select` is
1887db96d56Sopenharmony_ciO(highest file descriptor) and :c:func:`poll` is O(number of file
1897db96d56Sopenharmony_cidescriptors), ``/dev/poll`` is O(active file descriptors).
1907db96d56Sopenharmony_ci
1917db96d56Sopenharmony_ci``/dev/poll`` behaviour is very close to the standard :c:func:`poll`
1927db96d56Sopenharmony_ciobject.
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci
1957db96d56Sopenharmony_ci.. method:: devpoll.close()
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci   Close the file descriptor of the polling object.
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci   .. versionadded:: 3.4
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci.. attribute:: devpoll.closed
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ci   ``True`` if the polling object is closed.
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci   .. versionadded:: 3.4
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci.. method:: devpoll.fileno()
2107db96d56Sopenharmony_ci
2117db96d56Sopenharmony_ci   Return the file descriptor number of the polling object.
2127db96d56Sopenharmony_ci
2137db96d56Sopenharmony_ci   .. versionadded:: 3.4
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci.. method:: devpoll.register(fd[, eventmask])
2177db96d56Sopenharmony_ci
2187db96d56Sopenharmony_ci   Register a file descriptor with the polling object.  Future calls to the
2197db96d56Sopenharmony_ci   :meth:`poll` method will then check whether the file descriptor has any
2207db96d56Sopenharmony_ci   pending I/O events.  *fd* can be either an integer, or an object with a
2217db96d56Sopenharmony_ci   :meth:`~io.IOBase.fileno` method that returns an integer.  File objects
2227db96d56Sopenharmony_ci   implement :meth:`!fileno`, so they can also be used as the argument.
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ci   *eventmask* is an optional bitmask describing the type of events you want to
2257db96d56Sopenharmony_ci   check for. The constants are the same that with :c:func:`poll`
2267db96d56Sopenharmony_ci   object. The default value is a combination of the constants :const:`POLLIN`,
2277db96d56Sopenharmony_ci   :const:`POLLPRI`, and :const:`POLLOUT`.
2287db96d56Sopenharmony_ci
2297db96d56Sopenharmony_ci   .. warning::
2307db96d56Sopenharmony_ci
2317db96d56Sopenharmony_ci      Registering a file descriptor that's already registered is not an
2327db96d56Sopenharmony_ci      error, but the result is undefined. The appropriate action is to
2337db96d56Sopenharmony_ci      unregister or modify it first. This is an important difference
2347db96d56Sopenharmony_ci      compared with :c:func:`poll`.
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci
2377db96d56Sopenharmony_ci.. method:: devpoll.modify(fd[, eventmask])
2387db96d56Sopenharmony_ci
2397db96d56Sopenharmony_ci   This method does an :meth:`unregister` followed by a
2407db96d56Sopenharmony_ci   :meth:`register`. It is (a bit) more efficient that doing the same
2417db96d56Sopenharmony_ci   explicitly.
2427db96d56Sopenharmony_ci
2437db96d56Sopenharmony_ci
2447db96d56Sopenharmony_ci.. method:: devpoll.unregister(fd)
2457db96d56Sopenharmony_ci
2467db96d56Sopenharmony_ci   Remove a file descriptor being tracked by a polling object.  Just like the
2477db96d56Sopenharmony_ci   :meth:`register` method, *fd* can be an integer or an object with a
2487db96d56Sopenharmony_ci   :meth:`~io.IOBase.fileno` method that returns an integer.
2497db96d56Sopenharmony_ci
2507db96d56Sopenharmony_ci   Attempting to remove a file descriptor that was never registered is
2517db96d56Sopenharmony_ci   safely ignored.
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci.. method:: devpoll.poll([timeout])
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci   Polls the set of registered file descriptors, and returns a possibly empty list
2577db96d56Sopenharmony_ci   containing ``(fd, event)`` 2-tuples for the descriptors that have events or
2587db96d56Sopenharmony_ci   errors to report. *fd* is the file descriptor, and *event* is a bitmask with
2597db96d56Sopenharmony_ci   bits set for the reported events for that descriptor --- :const:`POLLIN` for
2607db96d56Sopenharmony_ci   waiting input, :const:`POLLOUT` to indicate that the descriptor can be written
2617db96d56Sopenharmony_ci   to, and so forth. An empty list indicates that the call timed out and no file
2627db96d56Sopenharmony_ci   descriptors had any events to report. If *timeout* is given, it specifies the
2637db96d56Sopenharmony_ci   length of time in milliseconds which the system will wait for events before
2647db96d56Sopenharmony_ci   returning. If *timeout* is omitted, -1, or :const:`None`, the call will
2657db96d56Sopenharmony_ci   block until there is an event for this poll object.
2667db96d56Sopenharmony_ci
2677db96d56Sopenharmony_ci   .. versionchanged:: 3.5
2687db96d56Sopenharmony_ci      The function is now retried with a recomputed timeout when interrupted by
2697db96d56Sopenharmony_ci      a signal, except if the signal handler raises an exception (see
2707db96d56Sopenharmony_ci      :pep:`475` for the rationale), instead of raising
2717db96d56Sopenharmony_ci      :exc:`InterruptedError`.
2727db96d56Sopenharmony_ci
2737db96d56Sopenharmony_ci
2747db96d56Sopenharmony_ci.. _epoll-objects:
2757db96d56Sopenharmony_ci
2767db96d56Sopenharmony_ciEdge and Level Trigger Polling (epoll) Objects
2777db96d56Sopenharmony_ci----------------------------------------------
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci   https://linux.die.net/man/4/epoll
2807db96d56Sopenharmony_ci
2817db96d56Sopenharmony_ci   *eventmask*
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ci   +-------------------------+-----------------------------------------------+
2847db96d56Sopenharmony_ci   | Constant                | Meaning                                       |
2857db96d56Sopenharmony_ci   +=========================+===============================================+
2867db96d56Sopenharmony_ci   | :const:`EPOLLIN`        | Available for read                            |
2877db96d56Sopenharmony_ci   +-------------------------+-----------------------------------------------+
2887db96d56Sopenharmony_ci   | :const:`EPOLLOUT`       | Available for write                           |
2897db96d56Sopenharmony_ci   +-------------------------+-----------------------------------------------+
2907db96d56Sopenharmony_ci   | :const:`EPOLLPRI`       | Urgent data for read                          |
2917db96d56Sopenharmony_ci   +-------------------------+-----------------------------------------------+
2927db96d56Sopenharmony_ci   | :const:`EPOLLERR`       | Error condition happened on the assoc. fd     |
2937db96d56Sopenharmony_ci   +-------------------------+-----------------------------------------------+
2947db96d56Sopenharmony_ci   | :const:`EPOLLHUP`       | Hang up happened on the assoc. fd             |
2957db96d56Sopenharmony_ci   +-------------------------+-----------------------------------------------+
2967db96d56Sopenharmony_ci   | :const:`EPOLLET`        | Set Edge Trigger behavior, the default is     |
2977db96d56Sopenharmony_ci   |                         | Level Trigger behavior                        |
2987db96d56Sopenharmony_ci   +-------------------------+-----------------------------------------------+
2997db96d56Sopenharmony_ci   | :const:`EPOLLONESHOT`   | Set one-shot behavior. After one event is     |
3007db96d56Sopenharmony_ci   |                         | pulled out, the fd is internally disabled     |
3017db96d56Sopenharmony_ci   +-------------------------+-----------------------------------------------+
3027db96d56Sopenharmony_ci   | :const:`EPOLLEXCLUSIVE` | Wake only one epoll object when the           |
3037db96d56Sopenharmony_ci   |                         | associated fd has an event. The default (if   |
3047db96d56Sopenharmony_ci   |                         | this flag is not set) is to wake all epoll    |
3057db96d56Sopenharmony_ci   |                         | objects polling on a fd.                      |
3067db96d56Sopenharmony_ci   +-------------------------+-----------------------------------------------+
3077db96d56Sopenharmony_ci   | :const:`EPOLLRDHUP`     | Stream socket peer closed connection or shut  |
3087db96d56Sopenharmony_ci   |                         | down writing half of connection.              |
3097db96d56Sopenharmony_ci   +-------------------------+-----------------------------------------------+
3107db96d56Sopenharmony_ci   | :const:`EPOLLRDNORM`    | Equivalent to :const:`EPOLLIN`                |
3117db96d56Sopenharmony_ci   +-------------------------+-----------------------------------------------+
3127db96d56Sopenharmony_ci   | :const:`EPOLLRDBAND`    | Priority data band can be read.               |
3137db96d56Sopenharmony_ci   +-------------------------+-----------------------------------------------+
3147db96d56Sopenharmony_ci   | :const:`EPOLLWRNORM`    | Equivalent to :const:`EPOLLOUT`               |
3157db96d56Sopenharmony_ci   +-------------------------+-----------------------------------------------+
3167db96d56Sopenharmony_ci   | :const:`EPOLLWRBAND`    | Priority data may be written.                 |
3177db96d56Sopenharmony_ci   +-------------------------+-----------------------------------------------+
3187db96d56Sopenharmony_ci   | :const:`EPOLLMSG`       | Ignored.                                      |
3197db96d56Sopenharmony_ci   +-------------------------+-----------------------------------------------+
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ci   .. versionadded:: 3.6
3227db96d56Sopenharmony_ci      :const:`EPOLLEXCLUSIVE` was added.  It's only supported by Linux Kernel 4.5
3237db96d56Sopenharmony_ci      or later.
3247db96d56Sopenharmony_ci
3257db96d56Sopenharmony_ci.. method:: epoll.close()
3267db96d56Sopenharmony_ci
3277db96d56Sopenharmony_ci   Close the control file descriptor of the epoll object.
3287db96d56Sopenharmony_ci
3297db96d56Sopenharmony_ci
3307db96d56Sopenharmony_ci.. attribute:: epoll.closed
3317db96d56Sopenharmony_ci
3327db96d56Sopenharmony_ci   ``True`` if the epoll object is closed.
3337db96d56Sopenharmony_ci
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ci.. method:: epoll.fileno()
3367db96d56Sopenharmony_ci
3377db96d56Sopenharmony_ci   Return the file descriptor number of the control fd.
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ci
3407db96d56Sopenharmony_ci.. method:: epoll.fromfd(fd)
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ci   Create an epoll object from a given file descriptor.
3437db96d56Sopenharmony_ci
3447db96d56Sopenharmony_ci
3457db96d56Sopenharmony_ci.. method:: epoll.register(fd[, eventmask])
3467db96d56Sopenharmony_ci
3477db96d56Sopenharmony_ci   Register a fd descriptor with the epoll object.
3487db96d56Sopenharmony_ci
3497db96d56Sopenharmony_ci
3507db96d56Sopenharmony_ci.. method:: epoll.modify(fd, eventmask)
3517db96d56Sopenharmony_ci
3527db96d56Sopenharmony_ci   Modify a registered file descriptor.
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ci
3557db96d56Sopenharmony_ci.. method:: epoll.unregister(fd)
3567db96d56Sopenharmony_ci
3577db96d56Sopenharmony_ci   Remove a registered file descriptor from the epoll object.
3587db96d56Sopenharmony_ci
3597db96d56Sopenharmony_ci   .. versionchanged:: 3.9
3607db96d56Sopenharmony_ci      The method no longer ignores the :data:`~errno.EBADF` error.
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci
3637db96d56Sopenharmony_ci.. method:: epoll.poll(timeout=None, maxevents=-1)
3647db96d56Sopenharmony_ci
3657db96d56Sopenharmony_ci   Wait for events. timeout in seconds (float)
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_ci   .. versionchanged:: 3.5
3687db96d56Sopenharmony_ci      The function is now retried with a recomputed timeout when interrupted by
3697db96d56Sopenharmony_ci      a signal, except if the signal handler raises an exception (see
3707db96d56Sopenharmony_ci      :pep:`475` for the rationale), instead of raising
3717db96d56Sopenharmony_ci      :exc:`InterruptedError`.
3727db96d56Sopenharmony_ci
3737db96d56Sopenharmony_ci
3747db96d56Sopenharmony_ci.. _poll-objects:
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ciPolling Objects
3777db96d56Sopenharmony_ci---------------
3787db96d56Sopenharmony_ci
3797db96d56Sopenharmony_ciThe :c:func:`poll` system call, supported on most Unix systems, provides better
3807db96d56Sopenharmony_ciscalability for network servers that service many, many clients at the same
3817db96d56Sopenharmony_citime. :c:func:`poll` scales better because the system call only requires listing
3827db96d56Sopenharmony_cithe file descriptors of interest, while :c:func:`select` builds a bitmap, turns
3837db96d56Sopenharmony_cion bits for the fds of interest, and then afterward the whole bitmap has to be
3847db96d56Sopenharmony_cilinearly scanned again. :c:func:`select` is O(highest file descriptor), while
3857db96d56Sopenharmony_ci:c:func:`poll` is O(number of file descriptors).
3867db96d56Sopenharmony_ci
3877db96d56Sopenharmony_ci
3887db96d56Sopenharmony_ci.. method:: poll.register(fd[, eventmask])
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_ci   Register a file descriptor with the polling object.  Future calls to the
3917db96d56Sopenharmony_ci   :meth:`poll` method will then check whether the file descriptor has any
3927db96d56Sopenharmony_ci   pending I/O events.  *fd* can be either an integer, or an object with a
3937db96d56Sopenharmony_ci   :meth:`~io.IOBase.fileno` method that returns an integer.  File objects
3947db96d56Sopenharmony_ci   implement :meth:`!fileno`, so they can also be used as the argument.
3957db96d56Sopenharmony_ci
3967db96d56Sopenharmony_ci   *eventmask* is an optional bitmask describing the type of events you want to
3977db96d56Sopenharmony_ci   check for, and can be a combination of the constants :const:`POLLIN`,
3987db96d56Sopenharmony_ci   :const:`POLLPRI`, and :const:`POLLOUT`, described in the table below.  If not
3997db96d56Sopenharmony_ci   specified, the default value used will check for all 3 types of events.
4007db96d56Sopenharmony_ci
4017db96d56Sopenharmony_ci   +-------------------+------------------------------------------+
4027db96d56Sopenharmony_ci   | Constant          | Meaning                                  |
4037db96d56Sopenharmony_ci   +===================+==========================================+
4047db96d56Sopenharmony_ci   | :const:`POLLIN`   | There is data to read                    |
4057db96d56Sopenharmony_ci   +-------------------+------------------------------------------+
4067db96d56Sopenharmony_ci   | :const:`POLLPRI`  | There is urgent data to read             |
4077db96d56Sopenharmony_ci   +-------------------+------------------------------------------+
4087db96d56Sopenharmony_ci   | :const:`POLLOUT`  | Ready for output: writing will not block |
4097db96d56Sopenharmony_ci   +-------------------+------------------------------------------+
4107db96d56Sopenharmony_ci   | :const:`POLLERR`  | Error condition of some sort             |
4117db96d56Sopenharmony_ci   +-------------------+------------------------------------------+
4127db96d56Sopenharmony_ci   | :const:`POLLHUP`  | Hung up                                  |
4137db96d56Sopenharmony_ci   +-------------------+------------------------------------------+
4147db96d56Sopenharmony_ci   | :const:`POLLRDHUP`| Stream socket peer closed connection, or |
4157db96d56Sopenharmony_ci   |                   | shut down writing half of connection     |
4167db96d56Sopenharmony_ci   +-------------------+------------------------------------------+
4177db96d56Sopenharmony_ci   | :const:`POLLNVAL` | Invalid request: descriptor not open     |
4187db96d56Sopenharmony_ci   +-------------------+------------------------------------------+
4197db96d56Sopenharmony_ci
4207db96d56Sopenharmony_ci   Registering a file descriptor that's already registered is not an error, and has
4217db96d56Sopenharmony_ci   the same effect as registering the descriptor exactly once.
4227db96d56Sopenharmony_ci
4237db96d56Sopenharmony_ci
4247db96d56Sopenharmony_ci.. method:: poll.modify(fd, eventmask)
4257db96d56Sopenharmony_ci
4267db96d56Sopenharmony_ci   Modifies an already registered fd. This has the same effect as
4277db96d56Sopenharmony_ci   ``register(fd, eventmask)``.  Attempting to modify a file descriptor
4287db96d56Sopenharmony_ci   that was never registered causes an :exc:`OSError` exception with errno
4297db96d56Sopenharmony_ci   :const:`ENOENT` to be raised.
4307db96d56Sopenharmony_ci
4317db96d56Sopenharmony_ci
4327db96d56Sopenharmony_ci.. method:: poll.unregister(fd)
4337db96d56Sopenharmony_ci
4347db96d56Sopenharmony_ci   Remove a file descriptor being tracked by a polling object.  Just like the
4357db96d56Sopenharmony_ci   :meth:`register` method, *fd* can be an integer or an object with a
4367db96d56Sopenharmony_ci   :meth:`~io.IOBase.fileno` method that returns an integer.
4377db96d56Sopenharmony_ci
4387db96d56Sopenharmony_ci   Attempting to remove a file descriptor that was never registered causes a
4397db96d56Sopenharmony_ci   :exc:`KeyError` exception to be raised.
4407db96d56Sopenharmony_ci
4417db96d56Sopenharmony_ci
4427db96d56Sopenharmony_ci.. method:: poll.poll([timeout])
4437db96d56Sopenharmony_ci
4447db96d56Sopenharmony_ci   Polls the set of registered file descriptors, and returns a possibly empty list
4457db96d56Sopenharmony_ci   containing ``(fd, event)`` 2-tuples for the descriptors that have events or
4467db96d56Sopenharmony_ci   errors to report. *fd* is the file descriptor, and *event* is a bitmask with
4477db96d56Sopenharmony_ci   bits set for the reported events for that descriptor --- :const:`POLLIN` for
4487db96d56Sopenharmony_ci   waiting input, :const:`POLLOUT` to indicate that the descriptor can be written
4497db96d56Sopenharmony_ci   to, and so forth. An empty list indicates that the call timed out and no file
4507db96d56Sopenharmony_ci   descriptors had any events to report. If *timeout* is given, it specifies the
4517db96d56Sopenharmony_ci   length of time in milliseconds which the system will wait for events before
4527db96d56Sopenharmony_ci   returning. If *timeout* is omitted, negative, or :const:`None`, the call will
4537db96d56Sopenharmony_ci   block until there is an event for this poll object.
4547db96d56Sopenharmony_ci
4557db96d56Sopenharmony_ci   .. versionchanged:: 3.5
4567db96d56Sopenharmony_ci      The function is now retried with a recomputed timeout when interrupted by
4577db96d56Sopenharmony_ci      a signal, except if the signal handler raises an exception (see
4587db96d56Sopenharmony_ci      :pep:`475` for the rationale), instead of raising
4597db96d56Sopenharmony_ci      :exc:`InterruptedError`.
4607db96d56Sopenharmony_ci
4617db96d56Sopenharmony_ci
4627db96d56Sopenharmony_ci.. _kqueue-objects:
4637db96d56Sopenharmony_ci
4647db96d56Sopenharmony_ciKqueue Objects
4657db96d56Sopenharmony_ci--------------
4667db96d56Sopenharmony_ci
4677db96d56Sopenharmony_ci.. method:: kqueue.close()
4687db96d56Sopenharmony_ci
4697db96d56Sopenharmony_ci   Close the control file descriptor of the kqueue object.
4707db96d56Sopenharmony_ci
4717db96d56Sopenharmony_ci
4727db96d56Sopenharmony_ci.. attribute:: kqueue.closed
4737db96d56Sopenharmony_ci
4747db96d56Sopenharmony_ci   ``True`` if the kqueue object is closed.
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ci
4777db96d56Sopenharmony_ci.. method:: kqueue.fileno()
4787db96d56Sopenharmony_ci
4797db96d56Sopenharmony_ci   Return the file descriptor number of the control fd.
4807db96d56Sopenharmony_ci
4817db96d56Sopenharmony_ci
4827db96d56Sopenharmony_ci.. method:: kqueue.fromfd(fd)
4837db96d56Sopenharmony_ci
4847db96d56Sopenharmony_ci   Create a kqueue object from a given file descriptor.
4857db96d56Sopenharmony_ci
4867db96d56Sopenharmony_ci
4877db96d56Sopenharmony_ci.. method:: kqueue.control(changelist, max_events[, timeout]) -> eventlist
4887db96d56Sopenharmony_ci
4897db96d56Sopenharmony_ci   Low level interface to kevent
4907db96d56Sopenharmony_ci
4917db96d56Sopenharmony_ci   - changelist must be an iterable of kevent objects or ``None``
4927db96d56Sopenharmony_ci   - max_events must be 0 or a positive integer
4937db96d56Sopenharmony_ci   - timeout in seconds (floats possible); the default is ``None``,
4947db96d56Sopenharmony_ci     to wait forever
4957db96d56Sopenharmony_ci
4967db96d56Sopenharmony_ci   .. versionchanged:: 3.5
4977db96d56Sopenharmony_ci      The function is now retried with a recomputed timeout when interrupted by
4987db96d56Sopenharmony_ci      a signal, except if the signal handler raises an exception (see
4997db96d56Sopenharmony_ci      :pep:`475` for the rationale), instead of raising
5007db96d56Sopenharmony_ci      :exc:`InterruptedError`.
5017db96d56Sopenharmony_ci
5027db96d56Sopenharmony_ci
5037db96d56Sopenharmony_ci.. _kevent-objects:
5047db96d56Sopenharmony_ci
5057db96d56Sopenharmony_ciKevent Objects
5067db96d56Sopenharmony_ci--------------
5077db96d56Sopenharmony_ci
5087db96d56Sopenharmony_cihttps://man.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2
5097db96d56Sopenharmony_ci
5107db96d56Sopenharmony_ci.. attribute:: kevent.ident
5117db96d56Sopenharmony_ci
5127db96d56Sopenharmony_ci   Value used to identify the event. The interpretation depends on the filter
5137db96d56Sopenharmony_ci   but it's usually the file descriptor. In the constructor ident can either
5147db96d56Sopenharmony_ci   be an int or an object with a :meth:`~io.IOBase.fileno` method. kevent
5157db96d56Sopenharmony_ci   stores the integer internally.
5167db96d56Sopenharmony_ci
5177db96d56Sopenharmony_ci.. attribute:: kevent.filter
5187db96d56Sopenharmony_ci
5197db96d56Sopenharmony_ci   Name of the kernel filter.
5207db96d56Sopenharmony_ci
5217db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5227db96d56Sopenharmony_ci   | Constant                  | Meaning                                     |
5237db96d56Sopenharmony_ci   +===========================+=============================================+
5247db96d56Sopenharmony_ci   | :const:`KQ_FILTER_READ`   | Takes a descriptor and returns whenever     |
5257db96d56Sopenharmony_ci   |                           | there is data available to read             |
5267db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5277db96d56Sopenharmony_ci   | :const:`KQ_FILTER_WRITE`  | Takes a descriptor and returns whenever     |
5287db96d56Sopenharmony_ci   |                           | there is data available to write            |
5297db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5307db96d56Sopenharmony_ci   | :const:`KQ_FILTER_AIO`    | AIO requests                                |
5317db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5327db96d56Sopenharmony_ci   | :const:`KQ_FILTER_VNODE`  | Returns when one or more of the requested   |
5337db96d56Sopenharmony_ci   |                           | events watched in *fflag* occurs            |
5347db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5357db96d56Sopenharmony_ci   | :const:`KQ_FILTER_PROC`   | Watch for events on a process id            |
5367db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5377db96d56Sopenharmony_ci   | :const:`KQ_FILTER_NETDEV` | Watch for events on a network device        |
5387db96d56Sopenharmony_ci   |                           | [not available on macOS]                    |
5397db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5407db96d56Sopenharmony_ci   | :const:`KQ_FILTER_SIGNAL` | Returns whenever the watched signal is      |
5417db96d56Sopenharmony_ci   |                           | delivered to the process                    |
5427db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5437db96d56Sopenharmony_ci   | :const:`KQ_FILTER_TIMER`  | Establishes an arbitrary timer              |
5447db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5457db96d56Sopenharmony_ci
5467db96d56Sopenharmony_ci.. attribute:: kevent.flags
5477db96d56Sopenharmony_ci
5487db96d56Sopenharmony_ci   Filter action.
5497db96d56Sopenharmony_ci
5507db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5517db96d56Sopenharmony_ci   | Constant                  | Meaning                                     |
5527db96d56Sopenharmony_ci   +===========================+=============================================+
5537db96d56Sopenharmony_ci   | :const:`KQ_EV_ADD`        | Adds or modifies an event                   |
5547db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5557db96d56Sopenharmony_ci   | :const:`KQ_EV_DELETE`     | Removes an event from the queue             |
5567db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5577db96d56Sopenharmony_ci   | :const:`KQ_EV_ENABLE`     | Permitscontrol() to returns the event       |
5587db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5597db96d56Sopenharmony_ci   | :const:`KQ_EV_DISABLE`    | Disablesevent                               |
5607db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5617db96d56Sopenharmony_ci   | :const:`KQ_EV_ONESHOT`    | Removes event after first occurrence        |
5627db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5637db96d56Sopenharmony_ci   | :const:`KQ_EV_CLEAR`      | Reset the state after an event is retrieved |
5647db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5657db96d56Sopenharmony_ci   | :const:`KQ_EV_SYSFLAGS`   | internal event                              |
5667db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5677db96d56Sopenharmony_ci   | :const:`KQ_EV_FLAG1`      | internal event                              |
5687db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5697db96d56Sopenharmony_ci   | :const:`KQ_EV_EOF`        | Filter specific EOF condition               |
5707db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5717db96d56Sopenharmony_ci   | :const:`KQ_EV_ERROR`      | See return values                           |
5727db96d56Sopenharmony_ci   +---------------------------+---------------------------------------------+
5737db96d56Sopenharmony_ci
5747db96d56Sopenharmony_ci
5757db96d56Sopenharmony_ci.. attribute:: kevent.fflags
5767db96d56Sopenharmony_ci
5777db96d56Sopenharmony_ci   Filter specific flags.
5787db96d56Sopenharmony_ci
5797db96d56Sopenharmony_ci   :const:`KQ_FILTER_READ` and  :const:`KQ_FILTER_WRITE` filter flags:
5807db96d56Sopenharmony_ci
5817db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
5827db96d56Sopenharmony_ci   | Constant                   | Meaning                                    |
5837db96d56Sopenharmony_ci   +============================+============================================+
5847db96d56Sopenharmony_ci   | :const:`KQ_NOTE_LOWAT`     | low water mark of a socket buffer          |
5857db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
5867db96d56Sopenharmony_ci
5877db96d56Sopenharmony_ci   :const:`KQ_FILTER_VNODE` filter flags:
5887db96d56Sopenharmony_ci
5897db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
5907db96d56Sopenharmony_ci   | Constant                   | Meaning                                    |
5917db96d56Sopenharmony_ci   +============================+============================================+
5927db96d56Sopenharmony_ci   | :const:`KQ_NOTE_DELETE`    | *unlink()* was called                      |
5937db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
5947db96d56Sopenharmony_ci   | :const:`KQ_NOTE_WRITE`     | a write occurred                           |
5957db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
5967db96d56Sopenharmony_ci   | :const:`KQ_NOTE_EXTEND`    | the file was extended                      |
5977db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
5987db96d56Sopenharmony_ci   | :const:`KQ_NOTE_ATTRIB`    | an attribute was changed                   |
5997db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6007db96d56Sopenharmony_ci   | :const:`KQ_NOTE_LINK`      | the link count has changed                 |
6017db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6027db96d56Sopenharmony_ci   | :const:`KQ_NOTE_RENAME`    | the file was renamed                       |
6037db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6047db96d56Sopenharmony_ci   | :const:`KQ_NOTE_REVOKE`    | access to the file was revoked             |
6057db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6067db96d56Sopenharmony_ci
6077db96d56Sopenharmony_ci   :const:`KQ_FILTER_PROC` filter flags:
6087db96d56Sopenharmony_ci
6097db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6107db96d56Sopenharmony_ci   | Constant                   | Meaning                                    |
6117db96d56Sopenharmony_ci   +============================+============================================+
6127db96d56Sopenharmony_ci   | :const:`KQ_NOTE_EXIT`      | the process has exited                     |
6137db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6147db96d56Sopenharmony_ci   | :const:`KQ_NOTE_FORK`      | the process has called *fork()*            |
6157db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6167db96d56Sopenharmony_ci   | :const:`KQ_NOTE_EXEC`      | the process has executed a new process     |
6177db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6187db96d56Sopenharmony_ci   | :const:`KQ_NOTE_PCTRLMASK` | internal filter flag                       |
6197db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6207db96d56Sopenharmony_ci   | :const:`KQ_NOTE_PDATAMASK` | internal filter flag                       |
6217db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6227db96d56Sopenharmony_ci   | :const:`KQ_NOTE_TRACK`     | follow a process across *fork()*           |
6237db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6247db96d56Sopenharmony_ci   | :const:`KQ_NOTE_CHILD`     | returned on the child process for          |
6257db96d56Sopenharmony_ci   |                            | *NOTE_TRACK*                               |
6267db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6277db96d56Sopenharmony_ci   | :const:`KQ_NOTE_TRACKERR`  | unable to attach to a child                |
6287db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6297db96d56Sopenharmony_ci
6307db96d56Sopenharmony_ci   :const:`KQ_FILTER_NETDEV` filter flags (not available on macOS):
6317db96d56Sopenharmony_ci
6327db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6337db96d56Sopenharmony_ci   | Constant                   | Meaning                                    |
6347db96d56Sopenharmony_ci   +============================+============================================+
6357db96d56Sopenharmony_ci   | :const:`KQ_NOTE_LINKUP`    | link is up                                 |
6367db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6377db96d56Sopenharmony_ci   | :const:`KQ_NOTE_LINKDOWN`  | link is down                               |
6387db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6397db96d56Sopenharmony_ci   | :const:`KQ_NOTE_LINKINV`   | link state is invalid                      |
6407db96d56Sopenharmony_ci   +----------------------------+--------------------------------------------+
6417db96d56Sopenharmony_ci
6427db96d56Sopenharmony_ci
6437db96d56Sopenharmony_ci.. attribute:: kevent.data
6447db96d56Sopenharmony_ci
6457db96d56Sopenharmony_ci   Filter specific data.
6467db96d56Sopenharmony_ci
6477db96d56Sopenharmony_ci
6487db96d56Sopenharmony_ci.. attribute:: kevent.udata
6497db96d56Sopenharmony_ci
6507db96d56Sopenharmony_ci   User defined value.
651