Penguin

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

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

Newer page: version 3 Last edited on Saturday, August 23, 2003 4:47:45 pm by JohnMcPherson
Older page: version 1 Last edited on Tuesday, June 4, 2002 12:23:44 am by perry Revert
@@ -1,211 +1,97 @@
-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 __  
-#include __  
-#include __ 
+ __#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 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''__);__  
  
-__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 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__ 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''
  
-  
-Their function is identical, with three  
-differences:  
-  
-  
-(i)  
-  
-  
-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).  
-  
-  
-(ii)  
-  
-  
-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 
+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.  
  
-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.  
  
-''n'' is the highest-numbered descriptor in any of the  
-three sets, plus 1.  
  
+''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.  
  
-''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
+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
  
-  
-''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.  
  
-  
-__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.  
  
-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;  
  
-#include  
-!!CONFORMING TO  
+ /* Watch stdin (fd ) to see when it has input. */  
+ FD_ZERO(&rfds);  
+ FD_SET(, &rfds);  
+ /* Wait up to five seconds. */  
+ tv.tv_sec = 5;  
+ tv.tv_usec = ;  
  
+ retval = select(1, &rfds, NULL, NULL, &tv);  
+ /* Don't rely on the value of tv now! */  
  
-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
+ if (retval)  
+ printf("Data is available now .\n" );  
+ /* FD_ISSET (, &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 
+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.