xref: /freebsd/lib/libsys/select.2 (revision 8269e7673cf033aba67dab8264fe719920c70f87)
1*8269e767SBrooks Davis.\" Copyright (c) 1983, 1991, 1993
2*8269e767SBrooks Davis.\"	The Regents of the University of California.  All rights reserved.
3*8269e767SBrooks Davis.\"
4*8269e767SBrooks Davis.\" Redistribution and use in source and binary forms, with or without
5*8269e767SBrooks Davis.\" modification, are permitted provided that the following conditions
6*8269e767SBrooks Davis.\" are met:
7*8269e767SBrooks Davis.\" 1. Redistributions of source code must retain the above copyright
8*8269e767SBrooks Davis.\"    notice, this list of conditions and the following disclaimer.
9*8269e767SBrooks Davis.\" 2. Redistributions in binary form must reproduce the above copyright
10*8269e767SBrooks Davis.\"    notice, this list of conditions and the following disclaimer in the
11*8269e767SBrooks Davis.\"    documentation and/or other materials provided with the distribution.
12*8269e767SBrooks Davis.\" 3. Neither the name of the University nor the names of its contributors
13*8269e767SBrooks Davis.\"    may be used to endorse or promote products derived from this software
14*8269e767SBrooks Davis.\"    without specific prior written permission.
15*8269e767SBrooks Davis.\"
16*8269e767SBrooks Davis.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17*8269e767SBrooks Davis.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*8269e767SBrooks Davis.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*8269e767SBrooks Davis.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
20*8269e767SBrooks Davis.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*8269e767SBrooks Davis.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22*8269e767SBrooks Davis.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23*8269e767SBrooks Davis.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24*8269e767SBrooks Davis.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*8269e767SBrooks Davis.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*8269e767SBrooks Davis.\" SUCH DAMAGE.
27*8269e767SBrooks Davis.\"
28*8269e767SBrooks Davis.Dd June 25, 2020
29*8269e767SBrooks Davis.Dt SELECT 2
30*8269e767SBrooks Davis.Os
31*8269e767SBrooks Davis.Sh NAME
32*8269e767SBrooks Davis.Nm select
33*8269e767SBrooks Davis.Nd synchronous I/O multiplexing
34*8269e767SBrooks Davis.Sh LIBRARY
35*8269e767SBrooks Davis.Lb libc
36*8269e767SBrooks Davis.Sh SYNOPSIS
37*8269e767SBrooks Davis.In sys/select.h
38*8269e767SBrooks Davis.Ft int
39*8269e767SBrooks Davis.Fn select "int nfds" "fd_set *readfds" "fd_set *writefds" "fd_set *exceptfds" "struct timeval *timeout"
40*8269e767SBrooks Davis.Fn FD_SET fd &fdset
41*8269e767SBrooks Davis.Fn FD_CLR fd &fdset
42*8269e767SBrooks Davis.Fn FD_ISSET fd &fdset
43*8269e767SBrooks Davis.Fn FD_ZERO &fdset
44*8269e767SBrooks Davis.Sh DESCRIPTION
45*8269e767SBrooks DavisThe
46*8269e767SBrooks Davis.Fn select
47*8269e767SBrooks Davissystem call
48*8269e767SBrooks Davisexamines the I/O descriptor sets whose addresses are passed in
49*8269e767SBrooks Davis.Fa readfds ,
50*8269e767SBrooks Davis.Fa writefds ,
51*8269e767SBrooks Davisand
52*8269e767SBrooks Davis.Fa exceptfds
53*8269e767SBrooks Davisto see if some of their descriptors
54*8269e767SBrooks Davisare ready for reading, are ready for writing, or have an exceptional
55*8269e767SBrooks Daviscondition pending, respectively.
56*8269e767SBrooks DavisThe only exceptional condition detectable is out-of-band
57*8269e767SBrooks Davisdata received on a socket.
58*8269e767SBrooks DavisThe first
59*8269e767SBrooks Davis.Fa nfds
60*8269e767SBrooks Davisdescriptors are checked in each set;
61*8269e767SBrooks Davisi.e., the descriptors from 0 through
62*8269e767SBrooks Davis.Fa nfds Ns No -1
63*8269e767SBrooks Davisin the descriptor sets are examined.
64*8269e767SBrooks DavisOn return,
65*8269e767SBrooks Davis.Fn select
66*8269e767SBrooks Davisreplaces the given descriptor sets
67*8269e767SBrooks Daviswith subsets consisting of those descriptors that are ready
68*8269e767SBrooks Davisfor the requested operation.
69*8269e767SBrooks DavisThe
70*8269e767SBrooks Davis.Fn select
71*8269e767SBrooks Davissystem call
72*8269e767SBrooks Davisreturns the total number of ready descriptors in all the sets.
73*8269e767SBrooks Davis.Pp
74*8269e767SBrooks DavisThe descriptor sets are stored as bit fields in arrays of integers.
75*8269e767SBrooks DavisThe following macros are provided for manipulating such descriptor sets:
76*8269e767SBrooks Davis.Fn FD_ZERO &fdset
77*8269e767SBrooks Davisinitializes a descriptor set
78*8269e767SBrooks Davis.Fa fdset
79*8269e767SBrooks Davisto the null set.
80*8269e767SBrooks Davis.Fn FD_SET fd &fdset
81*8269e767SBrooks Davisincludes a particular descriptor
82*8269e767SBrooks Davis.Fa fd
83*8269e767SBrooks Davisin
84*8269e767SBrooks Davis.Fa fdset .
85*8269e767SBrooks Davis.Fn FD_CLR fd &fdset
86*8269e767SBrooks Davisremoves
87*8269e767SBrooks Davis.Fa fd
88*8269e767SBrooks Davisfrom
89*8269e767SBrooks Davis.Fa fdset .
90*8269e767SBrooks Davis.Fn FD_ISSET fd &fdset
91*8269e767SBrooks Davisis non-zero if
92*8269e767SBrooks Davis.Fa fd
93*8269e767SBrooks Davisis a member of
94*8269e767SBrooks Davis.Fa fdset ,
95*8269e767SBrooks Daviszero otherwise.
96*8269e767SBrooks DavisThe behavior of these macros is undefined if
97*8269e767SBrooks Davisa descriptor value is less than zero or greater than or equal to
98*8269e767SBrooks Davis.Dv FD_SETSIZE ,
99*8269e767SBrooks Daviswhich is normally at least equal
100*8269e767SBrooks Davisto the maximum number of descriptors supported by the system.
101*8269e767SBrooks Davis.Pp
102*8269e767SBrooks DavisIf
103*8269e767SBrooks Davis.Fa timeout
104*8269e767SBrooks Davisis not a null pointer, it specifies the maximum interval to wait for the
105*8269e767SBrooks Davisselection to complete.
106*8269e767SBrooks DavisSystem activity can lengthen the interval by
107*8269e767SBrooks Davisan indeterminate amount.
108*8269e767SBrooks Davis.Pp
109*8269e767SBrooks DavisIf
110*8269e767SBrooks Davis.Fa timeout
111*8269e767SBrooks Davisis a null pointer, the select blocks indefinitely.
112*8269e767SBrooks Davis.Pp
113*8269e767SBrooks DavisTo effect a poll, the
114*8269e767SBrooks Davis.Fa timeout
115*8269e767SBrooks Davisargument should not be a null pointer,
116*8269e767SBrooks Davisbut it should point to a zero-valued timeval structure.
117*8269e767SBrooks Davis.Pp
118*8269e767SBrooks DavisAny of
119*8269e767SBrooks Davis.Fa readfds ,
120*8269e767SBrooks Davis.Fa writefds ,
121*8269e767SBrooks Davisand
122*8269e767SBrooks Davis.Fa exceptfds
123*8269e767SBrooks Davismay be given as null pointers if no descriptors are of interest.
124*8269e767SBrooks Davis.Sh RETURN VALUES
125*8269e767SBrooks DavisThe
126*8269e767SBrooks Davis.Fn select
127*8269e767SBrooks Davissystem call
128*8269e767SBrooks Davisreturns the number of ready descriptors that are contained in
129*8269e767SBrooks Davisthe descriptor sets,
130*8269e767SBrooks Davisor -1 if an error occurred.
131*8269e767SBrooks DavisIf the time limit expires,
132*8269e767SBrooks Davis.Fn select
133*8269e767SBrooks Davisreturns 0.
134*8269e767SBrooks DavisIf
135*8269e767SBrooks Davis.Fn select
136*8269e767SBrooks Davisreturns with an error,
137*8269e767SBrooks Davisincluding one due to an interrupted system call,
138*8269e767SBrooks Davisthe descriptor sets will be unmodified.
139*8269e767SBrooks Davis.Sh ERRORS
140*8269e767SBrooks DavisAn error return from
141*8269e767SBrooks Davis.Fn select
142*8269e767SBrooks Davisindicates:
143*8269e767SBrooks Davis.Bl -tag -width Er
144*8269e767SBrooks Davis.It Bq Er EBADF
145*8269e767SBrooks DavisOne of the descriptor sets specified an invalid descriptor.
146*8269e767SBrooks Davis.It Bq Er EFAULT
147*8269e767SBrooks DavisOne of the arguments
148*8269e767SBrooks Davis.Fa readfds , writefds , exceptfds ,
149*8269e767SBrooks Davisor
150*8269e767SBrooks Davis.Fa timeout
151*8269e767SBrooks Davispoints to an invalid address.
152*8269e767SBrooks Davis.It Bq Er EINTR
153*8269e767SBrooks DavisA signal was delivered before the time limit expired and
154*8269e767SBrooks Davisbefore any of the selected events occurred.
155*8269e767SBrooks Davis.It Bq Er EINVAL
156*8269e767SBrooks DavisThe specified time limit is invalid.
157*8269e767SBrooks DavisOne of its components is
158*8269e767SBrooks Davisnegative or too large.
159*8269e767SBrooks Davis.It Bq Er EINVAL
160*8269e767SBrooks DavisThe
161*8269e767SBrooks Davis.Fa nfds
162*8269e767SBrooks Davisargument
163*8269e767SBrooks Daviswas invalid.
164*8269e767SBrooks Davis.El
165*8269e767SBrooks Davis.Sh SEE ALSO
166*8269e767SBrooks Davis.Xr accept 2 ,
167*8269e767SBrooks Davis.Xr connect 2 ,
168*8269e767SBrooks Davis.Xr getdtablesize 2 ,
169*8269e767SBrooks Davis.Xr gettimeofday 2 ,
170*8269e767SBrooks Davis.Xr kqueue 2 ,
171*8269e767SBrooks Davis.Xr poll 2 ,
172*8269e767SBrooks Davis.Xr pselect 2 ,
173*8269e767SBrooks Davis.Xr read 2 ,
174*8269e767SBrooks Davis.Xr recv 2 ,
175*8269e767SBrooks Davis.Xr send 2 ,
176*8269e767SBrooks Davis.Xr write 2 ,
177*8269e767SBrooks Davis.Xr clocks 7
178*8269e767SBrooks Davis.Sh NOTES
179*8269e767SBrooks DavisThe default size of
180*8269e767SBrooks Davis.Dv FD_SETSIZE
181*8269e767SBrooks Davisis currently 1024.
182*8269e767SBrooks DavisIn order to accommodate programs which might potentially
183*8269e767SBrooks Davisuse a larger number of open files with
184*8269e767SBrooks Davis.Fn select ,
185*8269e767SBrooks Davisit is possible
186*8269e767SBrooks Davisto increase this size by having the program define
187*8269e767SBrooks Davis.Dv FD_SETSIZE
188*8269e767SBrooks Davisbefore the inclusion of any header which includes
189*8269e767SBrooks Davis.In sys/types.h .
190*8269e767SBrooks Davis.Pp
191*8269e767SBrooks DavisIf
192*8269e767SBrooks Davis.Fa nfds
193*8269e767SBrooks Davisis greater than the number of open files,
194*8269e767SBrooks Davis.Fn select
195*8269e767SBrooks Davisis not guaranteed to examine the unused file descriptors.
196*8269e767SBrooks DavisFor historical
197*8269e767SBrooks Davisreasons,
198*8269e767SBrooks Davis.Fn select
199*8269e767SBrooks Daviswill always examine the first 256 descriptors.
200*8269e767SBrooks Davis.Sh STANDARDS
201*8269e767SBrooks DavisThe
202*8269e767SBrooks Davis.Fn select
203*8269e767SBrooks Davissystem call and
204*8269e767SBrooks Davis.Fn FD_CLR ,
205*8269e767SBrooks Davis.Fn FD_ISSET ,
206*8269e767SBrooks Davis.Fn FD_SET ,
207*8269e767SBrooks Davisand
208*8269e767SBrooks Davis.Fn FD_ZERO
209*8269e767SBrooks Davismacros conform with
210*8269e767SBrooks Davis.St -p1003.1-2001 .
211*8269e767SBrooks Davis.Sh HISTORY
212*8269e767SBrooks DavisThe
213*8269e767SBrooks Davis.Fn select
214*8269e767SBrooks Davissystem call appeared in
215*8269e767SBrooks Davis.Bx 4.2 .
216*8269e767SBrooks Davis.Sh BUGS
217*8269e767SBrooks Davis.St -susv2
218*8269e767SBrooks Davisallows systems to modify the original timeout in place.
219*8269e767SBrooks DavisThus, it is unwise to assume that the timeout value will be unmodified
220*8269e767SBrooks Davisby the
221*8269e767SBrooks Davis.Fn select
222*8269e767SBrooks Davissystem call.
223*8269e767SBrooks Davis.Fx
224*8269e767SBrooks Davisdoes not modify the return value, which can cause problems for applications
225*8269e767SBrooks Davisported from other systems.
226