Penguin

Differences between current version and predecessor to the previous major change of select(2).

Other diffs: Previous Revision, Previous Author, or view the Annotated Edit History

Newer page: version 3 Last edited on Saturday, August 23, 2003 2:48:19 pm by JohnMcPherson
Older page: version 1 Last edited on Tuesday, June 4, 2002 12:23:45 am by perry Revert
@@ -1,211 +1,116 @@
-SELECT  
-!!!SELECT  
-NAME  
-SYNOPSIS  
-DESCRIPTION  
-RETURN VALUE  
-ERRORS  
-NOTES  
-EXAMPLE  
-CONFORMING TO  
-SEE ALSO  
-----  
 !!NAME 
  
  
 select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - synchronous I/O multiplexing 
 !!SYNOPSIS 
+ __#include <sys/select.h>__ /* according to [POSIX] */  
  
+ /* Earlier standards */  
+ __#include <sys/time.h>__  
+ __#include <sys/types.h>__  
+ __#include <sys/unistd.h>__  
  
-__#include __  
-#include __  
-#include __ 
+ __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''__);__  
  
-__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''__);__ 
+ __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(2) and pselect(2) wait for a number of file descriptors to change status.  
  
+Their function is identical, with three differences:  
  
-The functions __select__ and __pselect __ wait for a  
-number of file descriptors to change status
+# The __select__ function uses a timeout that is a ''struct timeval'' (with seconds and microseconds), while pselect(2) 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.  
  
-Their function is identical, with three  
-differences:  
+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.  
  
-(i
+''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 __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 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
  
+!The timeout  
+The time structures involved are defined in <sys/time.h> and look like  
+ struct timeval {  
+ long tv_sec; /* seconds */  
+ long tv_usec; /* microseconds */  
+ };  
+and  
+ struct timespec {  
+ long tv_sec; /* seconds */  
+ long tv_nsec; /* nanoseconds */  
+ };  
  
-(ii)  
+Some code calls select with all three sets empty, n zero, and a non&#8208;null timeout as a fairly portable way to sleep with subsecond precision.  
  
+On Linux, the function select modifies timeout 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 selects in a loop without reinitializing it. Consider timeout to be undefined after select returns.  
  
-The __select__ function may update the ''timeout''  
-parameter to indicate how much time was left. The  
-__pselect__ function does not change this  
-parameter.  
-  
-  
-(iii)  
-  
-  
-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.  
  
-  
-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.  
  
-__EBADF __ 
+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.  
  
+This is very slow if the number of fd's in the fdsets are large, especially if not many are active at any particular time. This can have the surprising effect of your program using 100% cpu time with a very low number of fd's (a few thousand), but still being able to run effectively for as much as 10x the number of fds. This is due to the fact that each time through your loop around select(2), you only have (on average) one fd to wake up initially, so you have a lot of overhead for that one fd. However as you get more fd's more and more of them occur during one pass through select(2) and your program starts doing more work per mainloop.  
+!!EXAMPLE  
+#include <stdio.h>  
+#include <sys/time.h>  
+#include <sys/types.h>  
+#include <unistd.h>  
  
-An invalid file descriptor was given in one of the  
-sets.  
+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;  
  
-__EINTR__  
+ 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;  
+ }  
  
-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  
 !!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. 
+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.  
  
-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)  
-----  
+accept(2), connect(2), poll(2), read(2), recv(2), send(2), sigprocmask(2), write(2) 
This page is a man page (or other imported legacy content). We are unable to automatically determine the license status of this page.