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