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 ] |
---|
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::BlankLine o; ; [ 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