Linux heracles.o2switch.net 4.18.0-553.62.1.lve.el8.x86_64 #1 SMP Mon Jul 21 17:50:35 UTC 2025 x86_64
/
opt
/
alt
/
ruby21
/
share
/
ri
/
2.1.0
/
system
/
IO
/
//opt/alt/ruby21/share/ri/2.1.0/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"LIt monitors given arrays of <code>IO</code> objects, waits one or more ;TI"Jof <code>IO</code> objects ready for reading, are ready for writing, ;TI"Iand have pending exceptions respectively, and returns an array that ;TI"Kcontains arrays of those IO objects. It will return <code>nil</code> ;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 notify readability. ;TI"=This "peek" is only happen for <code>IO</code> objects. ;TI"JIt is 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":The methods raises 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"XMost possible situation is <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"7However several more complicated situation exists.;T@o; ; [I"5SSL is a protocol which is sequence of records. ;TI")The record consists 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 writes some data. ;TI"EThis means <code>OpenSSL::SSL::SSLSocket#readpartial</code> may ;TI"=invoke <code>write</code> system call and it can block. ;TI"KIn such 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 process read form a stream.;T@o; ; [ I"=Finally, Linux kernel developers doesn't guarantee that ;TI"Jreadability of select(2) means readability of following read(2) even ;TI"for 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 in 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"YIO.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