302 lines
7.6 KiB
Groff
302 lines
7.6 KiB
Groff
.\" $NetBSD: poll.2,v 1.37 2021/02/09 09:01:29 wiz Exp $
|
|
.\"
|
|
.\" Copyright (c) 1998, 2005, 2020 The NetBSD Foundation, Inc.
|
|
.\" All rights reserved.
|
|
.\"
|
|
.\" This code is derived from software contributed to The NetBSD Foundation
|
|
.\" by Charles M. Hannum.
|
|
.\"
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
.\" modification, are permitted provided that the following conditions
|
|
.\" are met:
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
.\"
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
|
.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
|
.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
.\" POSSIBILITY OF SUCH DAMAGE.
|
|
.\"
|
|
.Dd February 8, 2021
|
|
.Dt POLL 2
|
|
.Os
|
|
.Sh NAME
|
|
.Nm poll, pollts, ppoll
|
|
.Nd synchronous I/O multiplexing
|
|
.Sh LIBRARY
|
|
.Lb libc
|
|
.Sh SYNOPSIS
|
|
.In poll.h
|
|
.Ft int
|
|
.Fn poll "struct pollfd *fds" "nfds_t nfds" "int timeout"
|
|
.In poll.h
|
|
.In signal.h
|
|
.In time.h
|
|
.Ft int
|
|
.Fn pollts "struct pollfd * restrict fds" "nfds_t nfds" "const struct timespec * restrict ts" "const sigset_t * restrict sigmask"
|
|
.In poll.h
|
|
.In signal.h
|
|
.In time.h
|
|
.Ft int
|
|
.Fn ppoll "struct pollfd * restrict fds" "nfds_t nfds" "const struct timespec * restrict ts" "const sigset_t * restrict sigmask"
|
|
.Sh DESCRIPTION
|
|
.Fn poll ,
|
|
.Fn pollts
|
|
and
|
|
.Fn ppoll
|
|
examine a set of file descriptors to see if some of them are ready for
|
|
I/O.
|
|
For each object inspected, the caller provides a list of conditions
|
|
(called ``events'') to check for, and the kernel returns a list of
|
|
conditions that are true.
|
|
The intent, as with
|
|
.Xr select 2 ,
|
|
is to check for whether I/O is possible before performing any, so as
|
|
to permit a top-level event loop to process input from many sources
|
|
(and output to many destinations)
|
|
without blocking on any of them and thus becoming stuck.
|
|
.Ss Arguments
|
|
The
|
|
.Fa fds
|
|
argument is a pointer to an array of pollfd structures, one per file
|
|
to inspect, as defined in
|
|
.In poll.h
|
|
(shown below).
|
|
The
|
|
.Fa nfds
|
|
argument gives the size of the
|
|
.Fa fds
|
|
array.
|
|
.Pp
|
|
If
|
|
.Fa timeout
|
|
is neither zero nor INFTIM (\-1), it specifies a maximum interval to
|
|
wait for any file descriptor to become ready, in milliseconds.
|
|
If
|
|
.Fa timeout
|
|
is INFTIM (\-1), then
|
|
.Fn poll
|
|
blocks indefinitely.
|
|
If
|
|
.Fa timeout
|
|
is zero, then
|
|
.Fn poll
|
|
will return without blocking.
|
|
.Pp
|
|
Similarly, if
|
|
.Fa ts
|
|
is not a null pointer, it references a timespec structure which specifies a
|
|
maximum interval to wait for any file descriptor to become ready.
|
|
If
|
|
.Fa ts
|
|
is a null pointer,
|
|
.Fn pollts
|
|
and
|
|
.Fn ppoll
|
|
block indefinitely.
|
|
If
|
|
.Fa ts
|
|
is not a null pointer, referencing a zero-valued timespec structure, then
|
|
.Fn pollts
|
|
and
|
|
.Fn ppoll
|
|
will return without blocking.
|
|
.Pp
|
|
If
|
|
.Fa sigmask
|
|
is not a null pointer, then the
|
|
.Fn pollts
|
|
and
|
|
.Fn ppoll
|
|
functions replace the signal mask of the caller by the set of
|
|
signals pointed to by
|
|
.Fa sigmask
|
|
while the call is in progress, and restore the caller's original
|
|
signal mask before returning.
|
|
.Pp
|
|
The
|
|
.Vt pollfd
|
|
structure:
|
|
.Bd -literal
|
|
struct pollfd {
|
|
int fd; /* file descriptor */
|
|
short events; /* events to look for */
|
|
short revents; /* events returned */
|
|
};
|
|
.Ed
|
|
.\" without this Pp there is no blank line after the struct which is ugly
|
|
.Pp
|
|
The fields of
|
|
.Fa struct pollfd
|
|
are as follows:
|
|
.Pp
|
|
.Bl -tag -width XXXrevents -compact
|
|
.It Fa fd
|
|
File descriptor to poll.
|
|
(Input)
|
|
.It Fa events
|
|
Conditions to poll for.
|
|
(Input)
|
|
.It Fa revents
|
|
Conditions that are true.
|
|
(Output)
|
|
.El
|
|
.Ss Conditions
|
|
There are four conditions that can be placed in
|
|
.Fa events
|
|
and reported in
|
|
.Fa revents :
|
|
.Pp
|
|
.Bl -tag -width XXXPOLLWRNORM -compact
|
|
.It POLLRDNORM
|
|
Normal data may be read without blocking.
|
|
.It POLLRDBAND
|
|
Urgent/out-of-band data may be read without blocking.
|
|
.It POLLWRNORM
|
|
Normal data may be written without blocking.
|
|
.It POLLWRBAND
|
|
Urgent/out-of-band data may be written without blocking.
|
|
.El
|
|
.Pp
|
|
There are three more conditions that are always checked for regardless
|
|
of
|
|
.Fa events
|
|
and thus may always be reported in
|
|
.Fa revents :
|
|
.Pp
|
|
.Bl -tag -width XXXPOLLWRNORM -compact
|
|
.It POLLERR
|
|
An exceptional condition has occurred on the object.
|
|
.It POLLHUP
|
|
The object has been disconnected.
|
|
.It POLLNVAL
|
|
The file descriptor is not open.
|
|
.El
|
|
.Pp
|
|
The following additional flags are defined:
|
|
.Pp
|
|
.Bl -tag -width XXXPOLLWRNORM -compact
|
|
.It POLLIN
|
|
Synonym for POLLRDNORM.
|
|
.It POLLOUT
|
|
Synonym for POLLWRNORM.
|
|
.It POLLPRI
|
|
Synonym for POLLRDBAND.
|
|
.El
|
|
.Ss Notes
|
|
If the value passed in
|
|
.Fa fd
|
|
is negative, the entry is ignored and
|
|
.Fa revents
|
|
is set to 0.
|
|
(POLLNVAL is
|
|
.Em not
|
|
set.)
|
|
.Pp
|
|
No file descriptor will ever produce POLLHUP at the same time as POLLWRNORM.
|
|
.\" (XXX but what about POLLWRBAND? POLLRDBAND? POLLRDNORM?)
|
|
.Pp
|
|
Sockets produce POLLIN rather than POLLHUP when the remote
|
|
end is closed.
|
|
.Sh RETURN VALUES
|
|
.Fn poll
|
|
returns the number of descriptors that are ready for I/O, or \-1 if an
|
|
error occurred.
|
|
If the time limit expires,
|
|
.Fn poll
|
|
returns 0.
|
|
If
|
|
.Fn poll
|
|
returns with an error,
|
|
including one due to an interrupted call,
|
|
the
|
|
.Fa fds
|
|
array will be unmodified.
|
|
.Sh COMPATIBILITY
|
|
This implementation differs from the historical one in that no individual
|
|
file descriptor may cause
|
|
.Fn poll
|
|
to return with an error.
|
|
In cases where this would have happened in the historical implementation
|
|
(e.g. trying to poll a
|
|
.Xr revoke 2 Ns d
|
|
descriptor), this implementation instead copies the
|
|
.Fa events
|
|
bitmask to the
|
|
.Fa revents
|
|
bitmask.
|
|
Attempting to perform I/O on this descriptor will then return an error.
|
|
This behavior is believed to be more useful.
|
|
.Pp
|
|
The
|
|
.Fn ppoll
|
|
function is a wrapper for
|
|
.Fn pollts
|
|
to provide compatibility with the Linux implementation.
|
|
.Sh ERRORS
|
|
An error return from
|
|
.Fn poll
|
|
indicates:
|
|
.Bl -tag -width Er
|
|
.It Bq Er EFAULT
|
|
.Fa fds
|
|
points outside the process's allocated address space.
|
|
.It Bq Er EINTR
|
|
A signal was delivered before the time limit expired and
|
|
before any of the selected events occurred.
|
|
.It Bq Er EINVAL
|
|
The specified time limit is negative or
|
|
the number of pollfd structures specified is larger than the current
|
|
file descriptor resource limit.
|
|
.El
|
|
.Sh SEE ALSO
|
|
.Xr accept 2 ,
|
|
.Xr connect 2 ,
|
|
.Xr read 2 ,
|
|
.Xr recv 2 ,
|
|
.Xr select 2 ,
|
|
.Xr send 2 ,
|
|
.Xr write 2
|
|
.Sh HISTORY
|
|
The
|
|
.Fn poll
|
|
function appeared in
|
|
.At V.3 ,
|
|
and was added to
|
|
.Nx
|
|
in
|
|
.Nx 1.3 .
|
|
The
|
|
.Fn pollts
|
|
function first appeared in
|
|
.Nx 3.0 .
|
|
The
|
|
.Fn ppoll
|
|
function first appeared in
|
|
.Nx 10.0 .
|
|
.Sh BUGS
|
|
As of this writing, in the underlying implementation, POLLIN and
|
|
POLLPRI are distinct flags from POLLRDNORM and POLLRDBAND
|
|
(respectively) and the behavior is not always exactly identical.
|
|
.Pp
|
|
The detailed behavior of specific flags is not very portable from one
|
|
OS to another.
|
|
.\" The old note, which is too vague to be helpful:
|
|
.\"
|
|
.\" The distinction between some of the fields in the
|
|
.\" .Fa events
|
|
.\" and
|
|
.\" .Fa revents
|
|
.\" bitmasks is really not useful without STREAMS.
|
|
.\" The fields are defined for compatibility with existing software.
|