#include <sys/select.h>
|
|
int
select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); FD_SET (fd, &fdset); FD_CLR (fd, &fdset); FD_ISSET (fd, &fdset); FD_ZERO (&fdset); |
The descriptor sets are stored as bit fields in arrays of integers.
The following macros are provided for manipulating such descriptor sets:
FD_ZERO (&fdset);
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 not a null pointer, it specifies the maximum interval to wait for the selection to complete. System activity can lengthen the interval by an indeterminate amount.
To effect a poll, the timeout argument should not be a null pointer, but it should point to a zero-valued timeval structure.
Any of readfds, writefds, and exceptfds may be given as null pointers if no descriptors are of interest.
#include <sys/select.h>
#include <unistd.h>
/*
* A simple example of testing a single FD for readability
* This example returns 1 when the fd is ready for reading.
*/
#include <sys/select.h>
#include <unistd.h>
/*
* A simple example of testing a single FD for readability
* This example returns 1 when the fd is ready for reading.
*/
int isready(int fd)
{
int rc;
fd_set fds;
struct timeval tv;
/*
* FD_ZERO() clears out the fd_set called fds, so that
* it doesn’t contain any file descriptors.
*/
FD_ZERO(&fds);
/*
* FD_SET() adds the file descriptor "fd" to the fd_set,
* so that select() will return if fd is readable
*/
FD_SET(fd,&fds);
tv.tv_sec = tv.tv_usec = 0;
/*
* The first argument to select is the highest file
* descriptor value plus 1.
*/
/* The second argument to select() is the address of
* the fd_set that contains fd’s we’re waiting
* to be readable.
*/
/* The third parameter is an fd_set that you want to
* know if you can write on -- this example doesn’t
* use it, so it passes 0, or NULL.
*/
/* The fourth parameter is sockets you’re waiting for
* out-of-band data for.
*/
/* The last parameter to select() is a time-out of how
* long select() should block.
*/
rc = select(fd+1, &fds, NULL, NULL, &tv);
/* select() returns the number of fd’s that are ready
* Once select() returns, the original fd_set has been
* modified so it now reflects the state of why select()
* woke up. i.e. If file descriptor 4 was originally in
* the fd_set, and then it became readable, the fd_set
* contains file descriptor 4 in it.
*/
if (rc < 0)
return -1;
return FD_ISSET(fd,&fds) ? 1 : 0;
}
| [EBADF] | |
| One of the descriptor sets specified an invalid descriptor. | |
| [EFAULT] | |
| One of the arguments readfds, writefds, exceptfds, or timeout points to an invalid address. | |
| [EINVAL] | |
| The specified time limit is invalid. One of its components is negative or too large. | |
| [EINVAL] | |
| The nfds argument was invalid. | |
#include <sys/types.h>
If nfds is greater than the number of open files, select is not guaranteed to examine the unused file descriptors. For historical reasons, select will always examine the first 256 descriptors. |
The select system call appeared in BSD 4.2.
|
© 2005-2007 Nokia |