method
select

Related methods
- Class methods (16)
-
binread (>= v1_9_1_378)
-
binwrite (>= v1_9_3_125)
-
console (>= v1_9_3_125)
-
copy_stream (>= v1_9_1_378)
-
foreach
-
for_fd
-
new
-
open
-
pipe
-
popen
-
read
-
readlines
-
select
-
sysopen
-
try_convert (>= v1_9_1_378)
-
write (>= v1_9_3_125)
- Instance methods (108)
-
<<
-
advise (>= v1_9_3_125)
-
autoclose= (>= v1_9_2_180)
-
autoclose? (>= v1_9_2_180)
-
beep (>= v2_4_6)
-
binmode
-
binmode? (>= v1_9_1_378)
-
block_scanf
-
bytes
-
chars
-
close
-
closed?
-
close_on_exec= (>= v1_9_1_378)
-
close_on_exec? (>= v1_9_1_378)
-
close_read
-
close_write
-
codepoints (>= v1_9_2_180)
-
cooked (>= v1_9_3_392)
-
cooked! (>= v1_9_3_392)
-
cursor (>= v2_4_6)
-
cursor= (>= v2_4_6)
-
each
-
each_byte
-
each_char
-
each_codepoint (>= v1_9_2_180)
-
each_line
-
echo= (>= v1_9_3_125)
-
echo? (>= v1_9_3_125)
-
eof
-
eof?
-
expect (>= v1_9_1_378)
-
external_encoding (>= v1_9_1_378)
-
fcntl
-
fdatasync (>= v1_9_2_180)
-
fileno
-
flush
-
fsync
-
getbyte
-
getc
-
getch (>= v1_9_3_125)
-
getpass (>= v2_4_6)
-
gets
-
goto (>= v2_4_6)
-
iflush (>= v1_9_3_125)
-
initialize_copy
-
inspect
-
internal_encoding (>= v1_9_1_378)
-
ioctl
-
ioflush (>= v1_9_3_125)
-
isatty
-
lineno
-
lineno=
-
lines
-
noecho (>= v1_9_3_125)
-
nonblock (>= v1_9_1_378)
-
nonblock= (>= v1_9_1_378)
-
nonblock? (>= v1_9_1_378)
-
nread (>= v1_9_2_180)
-
oflush (>= v1_9_3_125)
-
pathconf (>= v2_2_9)
-
pid
-
pos
-
pos=
-
pread (>= v2_5_5)
-
pressed? (>= v2_4_6)
-
print
-
printf
-
putc
-
puts
-
pwrite (>= v2_5_5)
-
raw (>= v1_9_3_125)
-
raw! (>= v1_9_3_125)
-
read
-
readbyte
-
readbytes
-
readchar
-
readline
-
readlines
-
__read_nonblock
(>= v2_4_6)
-
read_nonblock
-
readpartial
-
ready? (>= v1_9_1_378)
-
reopen
-
rewind
-
scanf
-
seek
-
set_encoding (>= v1_9_1_378)
-
soak_up_spaces
-
stat
-
sync
-
sync=
-
sysread
-
sysseek
-
syswrite
-
tell
-
to_i
-
to_io
-
tty?
-
ungetbyte (>= v1_9_1_378)
-
ungetc
-
wait (>= v1_9_1_378)
-
wait_readable (>= v2_1_10)
-
wait_writable (>= v2_1_10)
-
winsize (>= v1_9_3_125)
-
winsize= (>= v1_9_3_125)
-
write
-
__write_nonblock
(>= v2_4_6)
-
write_nonblock
= private
= protected
select(...)
public
See Kernel#select.
Show source
/* * call-seq: * IO.select(read_array * [, write_array * [, error_array * [, timeout]]] ) => array or nil * * See <code>Kernel#select</code>. */ static VALUE rb_f_select(argc, argv, obj) int argc; VALUE *argv; VALUE obj; { VALUE read, write, except, timeout, res, list; fd_set rset, wset, eset, pset; fd_set *rp, *wp, *ep; struct timeval *tp, timerec; rb_io_t *fptr; long i; int max = 0, n; int interrupt_flag = 0; int pending = 0; rb_scan_args(argc, argv, "13", &read, &write, &except, &timeout); if (NIL_P(timeout)) { tp = 0; } else { timerec = rb_time_interval(timeout); tp = &timerec; } FD_ZERO(&pset); if (!NIL_P(read)) { Check_Type(read, T_ARRAY); rp = &rset; FD_ZERO(rp); for (i=0; i<RARRAY(read)->len; i++) { GetOpenFile(rb_io_get_io(RARRAY(read)->ptr[i]), fptr); FD_SET(fileno(fptr->f), rp); if (READ_DATA_PENDING(fptr->f)) { /* check for buffered data */ pending++; FD_SET(fileno(fptr->f), &pset); } if (max < fileno(fptr->f)) max = fileno(fptr->f); } if (pending) { /* no blocking if there's buffered data */ timerec.tv_sec = timerec.tv_usec = 0; tp = &timerec; } } else rp = 0; if (!NIL_P(write)) { Check_Type(write, T_ARRAY); wp = &wset; FD_ZERO(wp); for (i=0; i<RARRAY(write)->len; i++) { GetOpenFile(rb_io_get_io(RARRAY(write)->ptr[i]), fptr); FD_SET(fileno(fptr->f), wp); if (max < fileno(fptr->f)) max = fileno(fptr->f); if (fptr->f2) { FD_SET(fileno(fptr->f2), wp); if (max < fileno(fptr->f2)) max = fileno(fptr->f2); } } } else wp = 0; if (!NIL_P(except)) { Check_Type(except, T_ARRAY); ep = &eset; FD_ZERO(ep); for (i=0; i<RARRAY(except)->len; i++) { GetOpenFile(rb_io_get_io(RARRAY(except)->ptr[i]), fptr); FD_SET(fileno(fptr->f), ep); if (max < fileno(fptr->f)) max = fileno(fptr->f); if (fptr->f2) { FD_SET(fileno(fptr->f2), ep); if (max < fileno(fptr->f2)) max = fileno(fptr->f2); } } } else { ep = 0; } max++; n = rb_thread_select(max, rp, wp, ep, tp); if (n < 0) { rb_sys_fail(0); } if (!pending && n == 0) return Qnil; /* returns nil on timeout */ res = rb_ary_new2(3); rb_ary_push(res, rp?rb_ary_new():rb_ary_new2(0)); rb_ary_push(res, wp?rb_ary_new():rb_ary_new2(0)); rb_ary_push(res, ep?rb_ary_new():rb_ary_new2(0)); if (interrupt_flag == 0) { if (rp) { list = RARRAY(res)->ptr[0]; for (i=0; i< RARRAY(read)->len; i++) { GetOpenFile(rb_io_get_io(RARRAY(read)->ptr[i]), fptr); if (FD_ISSET(fileno(fptr->f), rp) || FD_ISSET(fileno(fptr->f), &pset)) { rb_ary_push(list, rb_ary_entry(read, i)); } } } if (wp) { list = RARRAY(res)->ptr[1]; for (i=0; i< RARRAY(write)->len; i++) { GetOpenFile(rb_io_get_io(RARRAY(write)->ptr[i]), fptr); if (FD_ISSET(fileno(fptr->f), wp)) { rb_ary_push(list, rb_ary_entry(write, i)); } else if (fptr->f2 && FD_ISSET(fileno(fptr->f2), wp)) { rb_ary_push(list, rb_ary_entry(write, i)); } } } if (ep) { list = RARRAY(res)->ptr[2]; for (i=0; i< RARRAY(except)->len; i++) { GetOpenFile(rb_io_get_io(RARRAY(except)->ptr[i]), fptr); if (FD_ISSET(fileno(fptr->f), ep)) { rb_ary_push(list, rb_ary_entry(except, i)); } else if (fptr->f2 && FD_ISSET(fileno(fptr->f2), ep)) { rb_ary_push(list, rb_ary_entry(except, i)); } } } } return res; /* returns an empty array on interrupt */ }