#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 |