Penguin
Annotated edit history of select(2) version 3, including all changes. View license author blame.
Rev Author # Line
1 perry 1 !!NAME
2
3
4 select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - synchronous I/O multiplexing
5 !!SYNOPSIS
2 PerryLorier 6 __#include <sys/select.h>__ /* according to [POSIX] */
1 perry 7
2 PerryLorier 8 /* Earlier standards */
9 __#include <sys/time.h>__
10 __#include <sys/types.h>__
11 __#include <sys/unistd.h>__
1 perry 12
2 PerryLorier 13 __int select(int__ ''n''__, fd_set *__''readfds''__, fd_set *__''writefds''__, fd_set *__''exceptfds''__, struct timeval *__''timeout''__);__
1 perry 14
2 PerryLorier 15 __int pselect(int__ ''n''__, fd_set *__''readfds''__, fd_set *__''writefds''__, fd_set *__''exceptfds''__, const struct timespec *__''timeout''__, sigset_t *__ ''sigmask''__);__
1 perry 16
2 PerryLorier 17 __FD_CLR(int__ ''fd''__, fd_set *__''set''__);__
18 __FD_ISSET(int__ ''fd''__, fd_set *__''set''__);__
19 __FD_SET(int__ ''fd''__, fd_set *__''set''__);__
20 __FD_ZERO(fd_set *__''set''__);__
1 perry 21 !!DESCRIPTION
2 PerryLorier 22 The functions select(2) and pselect(2) wait for a number of file descriptors to change status.
1 perry 23
2 PerryLorier 24 Their function is identical, with three differences:
1 perry 25
2 PerryLorier 26 # 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).
27 # The __select__ function may update the ''timeout'' parameter to indicate how much time was left. The __pselect__ function does not change this parameter.
28 # The __select__ function has no ''sigmask'' parameter, and behaves as __pselect__ called with NULL ''sigmask''.
1 perry 29
2 PerryLorier 30 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.
1 perry 31
2 PerryLorier 32 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.
1 perry 33
2 PerryLorier 34 ''n'' is the highest-numbered descriptor in any of the three sets, plus 1.
1 perry 35
2 PerryLorier 36 ''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.
1 perry 37
2 PerryLorier 38 ''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.
1 perry 39
2 PerryLorier 40 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.
41 (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
42 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
43 __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.
1 perry 44
2 PerryLorier 45 !The timeout
46 The time structures involved are defined in <sys/time.h> and look like
47 struct timeval {
48 long tv_sec; /* seconds */
49 long tv_usec; /* microseconds */
50 };
51 and
52 struct timespec {
53 long tv_sec; /* seconds */
54 long tv_nsec; /* nanoseconds */
55 };
1 perry 56
2 PerryLorier 57 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.
1 perry 58
2 PerryLorier 59 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.
1 perry 60
61 !!RETURN VALUE
2 PerryLorier 62 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.
1 perry 63
64 !!ERRORS
2 PerryLorier 65 ;[EBADF]: An invalid file descriptor was given in one of the sets.
66 ;[EINTR]: A non blocked signal was caught.
67 ;[EINVAL]: ''n'' is negative.
68 ;[ENOMEM]: __select__ was unable to allocate memory for internal tables.
1 perry 69
2 PerryLorier 70 !!NOTES
71 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.
1 perry 72
2 PerryLorier 73 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.
1 perry 74
2 PerryLorier 75 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.
76 !!EXAMPLE
77 #include <stdio.h>
78 #include <sys/time.h>
79 #include <sys/types.h>
80 #include <unistd.h>
1 perry 81
2 PerryLorier 82 int
83 main(void) {
84 fd_set rfds;
85 struct timeval tv;
86 int retval;
1 perry 87
2 PerryLorier 88 /* Watch stdin (fd 0) to see when it has input. */
89 FD_ZERO(&rfds);
90 FD_SET(0, &rfds);
91 /* Wait up to five seconds. */
92 tv.tv_sec = 5;
93 tv.tv_usec = 0;
1 perry 94
2 PerryLorier 95 retval = select(1, &rfds, NULL, NULL, &tv);
3 JohnMcPherson 96 /* Don't rely on the value of tv now! */
1 perry 97
2 PerryLorier 98 if (retval)
99 printf("Data is available now.\n");
100 /* FD_ISSET(0, &rfds) will be true. */
101 else
102 printf("No data within five seconds.\n");
103 return 0;
104 }
1 perry 105
106 !!CONFORMING TO
107
108
3 JohnMcPherson 109 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
2 PerryLorier 110 V variants). However, note that the System V variant typically sets the timeout variable before exit, but the BSD variant does not.
1 perry 111
3 JohnMcPherson 112 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
2 PerryLorier 113 not take a ''sigmask'' parameter.
1 perry 114
115 !!SEE ALSO
2 PerryLorier 116 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.

PHP Warning

lib/blame.php:177: Warning: Invalid argument supplied for foreach() (...repeated 5 times)