Home
Main website
Display Sidebar
Hide Ads
Recent Changes
View Source:
pselect(2)
Edit
PageHistory
Diff
Info
LikePages
!!NAME select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - synchronous I/O multiplexing !!SYNOPSIS __#include <sys/select.h>__ __#include <sys/types.h>__ __#include <unistd.h>__ __int select(int__ ''n''__, fd_set *__''readfds''__, fd_set *__''writefds''__, fd_set *__''exceptfds''__, struct timeval *__''timeout''__);__ __int pselect(int__ ''n''__, fd_set *__''readfds''__, fd_set *__''writefds''__, fd_set *__''exceptfds''__, const struct timespec *__''timeout''__, sigset_t *__ ''sigmask''__);__ __FD_CLR(int__ ''fd''__, fd_set *__''set''__);__ __FD_ISSET(int__ ''fd''__, fd_set *__''set''__);__ __FD_SET(int__ ''fd''__, fd_set *__''set''__);__ __FD_ZERO(fd_set *__''set''__);__ !!DESCRIPTION The functions __select__ and __pselect__ wait for a number of file descriptors to change status. Their function is identical, with three differences: # The __select__ function uses a timeout that is a ''struct timeval'' (with seconds and microseconds), while __pselect__ uses a ''struct timespec'' (with seconds and nanoseconds). # The __select__ function may update the ''timeout'' parameter to indicate how much time was left. The __pselect__ function does not change this parameter. # The __select__ function has no ''sigmask'' parameter, and behaves as __pselect__ called with NULL ''sigmask''. Three independent sets of descriptors are watched. Those listed in ''readfds'' will be watched to see if characters become available for reading (more precisely, to see if a read will not block - in particular, a file descriptor is also ready on end-of-file), those in ''writefds'' will be watched to see if a write will not block, and those in ''exceptfds'' will be watched for exceptions. On exit, the sets are modified in place to indicate which descriptors actually changed status. Four macros are provided to manipulate the sets. __FD_ZERO__ will clear a set. __FD_SET__ and __FD_CLR__ add or remove a given descriptor from a set. __FD_ISSET__ tests to see if a descriptor is part of the set; this is useful after __select__ returns. ''n'' is the highest-numbered descriptor in any of the three sets, plus 1. ''timeout'' is an upper bound on the amount of time elapsed before __select__ returns. It may be zero, causing __select__ to return immediately. (This is useful for polling.) If ''timeout'' is NULL (no timeout), __select__ can block indefinitely. ''sigmask'' is a pointer to a signal mask (see sigprocmask(2)); if it is not NULL, then __pselect__ first replaces the current signal mask by the one pointed to by ''sigmask'', then does the `select' function, and then restores the original signal mask again. The idea of __pselect__ is that if one wants to wait for an event, either a signal or something on a file descriptor, an atomic test is needed to prevent race conditions. (Suppose the signal handler sets a global flag and returns. Then a test of this global flag followed by a call of __select__() could hang indefinitely if the signal arrived just after the test but just before the call. On the other hand, __pselect__ allows one to first block signals, handle the signals that have come in, then call __pselect__() with the desired ''sigmask'', avoiding the race.) Since Linux today does not have a ''pselect''() system call, the current glibc2 routine still contains this race. !!RETURN VALUE On success, __select__ and __pselect__ return the number of descriptors contained in the descriptor sets, which may be zero if the timeout expires before anything interesting happens. On error, -1 is returned, and ''errno'' is set appropriately; the sets and ''timeout'' become undefined, so do not rely on their contents after an error. !!ERRORS ;[EBADF]: An invalid file descriptor was given in one of the sets. ;[EINTR]: A non blocked signal was caught. ;[EINVAL]: ''n'' is negative. ;[ENOMEM]: __select__ was unable to allocate memory for internal tables. !!NOTES Some code calls __select__ with all three sets empty, __n__ zero, and a non-null ''timeout'' as a fairly portable way to sleep with subsecond precision. On Linux, ''timeout'' is modified to reflect the amount of time not slept; most other implementations do not do this. This causes problems both when Linux code which reads ''timeout'' is ported to other operating systems, and when code is ported to Linux that reuses a struct timeval for multiple __select__s in a loop without reinitializing it. Consider ''timeout'' to be undefined after __select__ returns. !!EXAMPLE #include <stdio.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int main(void) { fd_set rfds; struct timeval tv; int retval; /* Watch stdin (fd 0) to see when it has input. */ FD_ZERO(&rfds); FD_SET(0, &rfds); /* Wait up to five seconds. */ tv.tv_sec = 5; tv.tv_usec = 0; retval = select(1, &rfds, NULL, NULL, &tv); /* Don't rely on the value of tv now! */ if (retval) printf("Data is available now.\n"); /* FD_ISSET(0, &rfds) will be true. */ else printf("No data within five seconds.\n"); return 0; } !!CONFORMING TO 4.4BSD (the __select__ function first appeared in 4.2BSD). Generally portable to/from non-[BSD] systems supporting clones of the BSD socket layer (including System V variants). However, note that the System V variant typically sets the timeout variable before exit, but the BSD variant does not. The __pselect__ function is defined in IEEE Std 1003.1g-2000 ([POSIX].1g). It is found in glibc2.1 and later. Glibc2.0 has a function with this name, that however does not take a ''sigmask'' parameter. !!SEE ALSO accept(2), connect(2), poll(2), read(2), recv(2), send(2), sigprocmask(2), write(2)
2 pages link to
pselect(2)
:
Man2p
select(2)
This page is a man page (or other imported legacy content). We are unable to automatically determine the license status of this page.