SELECT(2)                        System Calls                        SELECT(2)


       select - synchronous I/O multiplexing


       #include <sys/types.h>
       #include <sys/time.h>
       #include <unistd.h>

       int  select  (int  nfds,  fd_set  *readfds,  fd_set  *writefds,  fd_set
       *exceptfds, struct timeval *timeout);

       FD_SET (int fd, fd_set &fdset);
       FD_CLR (int fd, fd_set &fdset);
       FD_ISSET (int fd, fd_set &fdset);
       FD_ZERO (fd_set &fdset);


       Select examines the I/O descriptor sets whose addresses are  passed  in
       readfds,  writefds,  and  exceptfds to see if some of their descriptors
       are ready for reading, are ready for writing, or  have  an  exceptional
       condition  pending,  respectively.   The  first  nfds  descriptors  are
       checked in each set; i.e., the descriptors from 0 through (nfds) in the
       descriptor  sets  are  examined.   On return, select replaces the given
       descriptor sets with subsets consisting of those descriptors  that  are
       ready  for the requested operation.  Select returns the total number of
       ready descriptors in all the sets.

       The descriptor sets are stored as bit fields  in  arrays  of  integers.
       The  following  macros  are  provided  for manipulating such descriptor
       sets: FD_ZERO(&fdsetx) initializes a descriptor set fdset to  the  null
       set.   FD_SET(fd, &fdset) includes a particular descriptor fd in fdset.
       FD_CLR(fd, &fdset) removes fd from fdset.  FD_ISSET(fd, &fdset) is non-
       zero if fd is a member of fdset, zero otherwise.  The behavior of these
       macros is undefined if a descriptor value is less than zero or  greater
       than  or  equal  to FD_SETSIZE, which is normally at least equal to the
       maximum number of descriptors supported by the system.

       If timeout is a non-NULL pointer, it specifies a  maximum  interval  to
       wait  for the selection to complete.  If timeout is a NULL pointer, the
       select blocks indefinitely.  To affect a  poll,  the  timeout  argument
       should be non-NULL, pointing to a zero-valued timeval structure.

       Any  of  readfds, writefds, and exceptfds may be given as NULL pointers
       if no descriptors are of interest.


       Select returns the number of ready descriptors that  are  contained  in
       the  descriptor  sets,  or  -1 if an error occurred.  If the time limit
       expires, select returns 0.  If select returns with an error,  including
       one due to an interrupted call, the descriptor sets will be unmodified.


       An error return from select indicates:

              EBADF  One of the descriptor sets specified an invalid  descrip-

              EINTR  A  signal was delivered before the time limit expired and
                     before any of the selected events occurred.

              EINVAL The specified time limit is invalid.  One of  its  compo-
                     nents is negative or too large.


       accept(2),   connect(2),  getdtablesize(2),  gettimeofday(2),  read(2),
       recv(2), send(2), write(2), clocks(7)


       Although the provision of getdtablesize(2) was intended to  allow  user
       programs to be written independent of the kernel limit on the number of
       open files, the dimension of a sufficiently large bit field for  select
       remains  a problem.  The default size FD_SETSIZE (currently 32 for GNO)
       is somewhat larger than the current kernel limit to the number of  open
       files.   Unlike  BSD systems, under GNO it is not possible for sites to
       reconfigure this limit since it requires recompilation of the kernel.

       Select should probably return the  time  remaining  from  the  original
       timeout,  if  any,  by  modifying the time value in place.  This may be
       implemented in future versions of the system.  Thus, it  is  unwise  to
       assume that the timeout value will be unmodified by the select call.


       The  select  function call appeared in 4.2BSD.  The first appearance in
       GNO was in v2.0.5.

GNO                             15 January 1997                      SELECT(2)

Man(1) output converted with man2html