select RBITS,WBITS,EBITS,TIMEOUTThis calls the select(2) syscall with the bit masks specified, whichcan be constructed using fileno
and vec
, along these lines:
- $rin = $win = $ein = '';
- vec($rin, fileno(STDIN), 1) = 1;
- vec($win, fileno(STDOUT), 1) = 1;
- $ein = $rin | $win;
If you want to select on many filehandles, you may wish to write asubroutine like this:
- sub fhbits {
- my @fhlist = @_;
- my $bits = "";
- for my $fh (@fhlist) {
- vec($bits, fileno($fh), 1) = 1;
- }
- return $bits;
- }
- $rin = fhbits(*STDIN, *TTY, *MYSOCK);
The usual idiom is:
- ($nfound,$timeleft) =
- select($rout=$rin, $wout=$win, $eout=$ein, $timeout);
or to block until something becomes ready just do this
- $nfound = select($rout=$rin, $wout=$win, $eout=$ein, undef);
Most systems do not bother to return anything useful in $timeleft, socalling select() in scalar context just returns $nfound.
Any of the bit masks can also be undef. The timeout, if specified, isin seconds, which may be fractional. Note: not all implementations arecapable of returning the $timeleft. If not, they always return$timeleft equal to the supplied $timeout.
You can effect a sleep of 250 milliseconds this way:
- select(undef, undef, undef, 0.25);
Note that whether select
gets restarted after signals (say, SIGALRM)is implementation-dependent. See also perlport for notes on theportability of select
.
On error, select
behaves just like select(2): it returns-1 and sets $!
.
On some Unixes, select(2) may report a socket file descriptor as "ready forreading" even when no data is available, and thus any subsequent read
would block. This can be avoided if you always use O_NONBLOCK on thesocket. See select(2) and fcntl(2) for further details.
The standard IO::Select
module provides a user-friendlier interfaceto select
, mostly because it does all the bit-mask work for you.
WARNING: One should not attempt to mix buffered I/O (like read
or <FH>) with select
, except as permitted by POSIX, and eventhen only on POSIX systems. You have to use sysread
instead.
Portability issues: select in perlport.