unixdev.net


Switch to SpeakEasy.net DSL

The Modular Manual Browser

Home Page
Manual: (SunOS-4.1.3)
Page:
Section:
Apropos / Subsearch:
optional field

SELECT(2)                     System Calls Manual                    SELECT(2)



NAME
       select - synchronous I/O multiplexing

SYNOPSIS
       #include <&lt;sys/types.h>&gt;
       #include <&lt;sys/time.h>&gt;

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

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

DESCRIPTION
       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, ready for writing, or have an exceptional condi-
       tion pending.  width is the number of bits to be checked  in  each  bit
       mask  that  represent a file descriptor; the descriptors from 0 through
       width-1 in the descriptor sets are examined.  Typically width  has  the
       value  returned  by  ulimit(3C) for the maximum number of file descrip-
       tors.  On return, select() replaces the given descriptor sets with sub-
       sets  consisting  of those descriptors that are ready for the requested
       operation.  The total number of ready descriptors in all  the  sets  is
       returned.

       The  descriptor  sets  are  stored as bit fields in arrays of integers.
       The following macros are  provided  for  manipulating  such  descriptor
       sets:  FD_ZERO  (&&amp;fdset) initializes a descriptor set fdset to the null
       set.  FD_SET(fd, &&amp;fdset ) includes a particular descriptor fd in fdset.
       FD_CLR(fd,  &&amp;fdset)  removes  fd  from  fdset.  FD_ISSET(fd, &&amp;fdset) is
       nonzero 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  not a 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  effect a poll, the timeout argument
       should be a non-NULL pointer, pointing to a zero-valued timeval  struc-
       ture.

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

       Selecting true for reading on a socket descriptor  upon  which  a  lis-
       ten(2)  call  has  been performed indicates that a subsequent accept(2)
       call on that descriptor will not block.

RETURN VALUES
       select() returns a non-negative value on  success.   A  positive  value
       indicates  the  number  of ready descriptors in the descriptor sets.  0
       indicates that the time limit referred to by timeout expired.  On fail-
       ure,  select()  returns  -1,  sets errno to indicate the error, and the
       descriptor sets are not changed.

ERRORS
       EBADF          One of the descriptor sets specified an invalid descrip-
                      tor.

       EFAULT         One of the pointers given in the call referred to a non-
                      existent portion of the process' address space.

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

       EINVAL         A  component of the pointed-to time limit is outside the
                      acceptable range: t_sec must  be  between  0  and  10^8,
                      inclusive.   t_usec  must be greater than or equal to 0,
                      and less than 10^6.

SEE ALSO
       accept(2), connect(2),  fcntl(2V),  ulimit(3C),  gettimeofday(2),  lis-
       ten(2), read(2V), recv(2), send(2), write(2V)

NOTES
       Under  rare  circumstances,  select() may indicate that a descriptor is
       ready for writing when in fact an attempt to write would  block.   This
       can  happen  if system resources necessary for a write are exhausted or
       otherwise unavailable.  If an application deems it critical that writes
       to  a  file descriptor not block, it should set the descriptor for non-
       blocking I/O using the F_SETFL request to fcntl(2V).

BUGS
       Although the provision of ulimit(3C) was intended to  allow  user  pro-
       grams  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 256) is
       somewhat larger than the current kernel limit to  the  number  of  open
       files.   However,  in  order to accommodate programs which might poten-
       tially use a larger number of open files with select, it is possible to
       increase this size within a program by providing a larger definition of
       FD_SETSIZE before the inclusion of <&lt;sys/types.h>&gt;.

       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  pointer  will be unmodified by the select()
       call.



                                21 January 1990                      SELECT(2)