select(2)
Name
select − synchronous I/O multiplexing
Syntax
#include <sys/time.h>
nfound = select(nfds, readfds, writefds, execptfds, timeout)
int nfound, nfds, *readfds, *writefds, *execptfds;
struct timeval *timeout;
Description
The select system call examines the I/O descriptors specified by the bit masks readfds, writefds, and execptfds to see if they are ready for reading, writing, or have an exceptional condition pending. The I/O descriptors can be pointers to arrays of integers, if multiple fd’s are required to be selected. File descriptor f is represented by the bit 1<<f in the mask. The nfds descriptors are checked, that is, the bits from 0 through nfds-1 in the masks are examined. The select system call returns, in place, a mask of those descriptors that are ready. The total number of ready descriptors is returned in nfound.
If timeout is a nonzero pointer, it specifies a maximum interval to wait for the selection to complete. If timeout is a zero pointer, the select blocks indefinitely. To affect a poll, the timeout argument should be nonzero, pointing to a 0-valued timeval structure.
Any of readfds, writefds, and execptfds can be given as zero (0) if no descriptors are of interest.
Return Value
The select system call returns the number of descriptors that are contained in the bit masks, or −1 if an error occurred. If the time limit expires, select returns 0.
Restrictions
If a process is blocked on a select waiting for input from a socket and the sending process closes the socket, the select notes this as an exception rather than as data. Hence, if the select is not currently looking for exceptions, it waits indefinitely.
The descriptor masks are always modified on return, even if the call returns as the result of the timeout.
Diagnostics
An error return from select indicates:
[EBADF] One of the bit masks specified an invalid descriptor.
[EINTR] A signal was delivered before the time limit expired and before any of the selected events occurred.
[EINVAL] The specified time limit is unacceptable. One of its components is negative or too large.