add description for IO.nonblock=.

This commit is contained in:
Tanaka Akira 2022-04-24 23:16:55 +09:00
Родитель e142bea799
Коммит 671d90eca3
1 изменённых файлов: 40 добавлений и 0 удалений

Просмотреть файл

@ -74,6 +74,46 @@ io_nonblock_set(int fd, int f, int nb)
*
* Enables non-blocking mode on a stream when set to
* +true+, and blocking mode when set to +false+.
*
* This method set or clear O_NONBLOCK flag for the file descriptor
* in <em>ios</em>.
*
* The behavior of most IO methods is not affected by this flag
* because they retry system calls to complete their task
* after EAGAIN and partial read/write.
* (An exception is IO#syswrite which doesn't retry.)
*
* This method can be used to clear non-blocking mode of standard I/O.
* Since nonblocking methods (read_nonblock, etc.) set non-blocking mode but
* they doesn't clear it, this method is usable as follows.
*
* END { STDOUT.nonblock = false }
* STDOUT.write_nonblock("foo")
*
* Since the flag is shared across processes and
* many non-Ruby commands doesn't expect standard I/O with non-blocking mode,
* it would be safe to clear the flag before Ruby program exits.
*
* For example following Ruby program leaves STDIN/STDOUT/STDER non-blocking mode.
* (STDIN, STDOUT and STDERR are connected to a terminal.
* So making one of them nonblocking-mode effects other two.)
* Thus cat command try to read from standard input and
* it causes "Resource temporarily unavailable" error (EAGAIN).
*
* % ruby -e '
* STDOUT.write_nonblock("foo\n")'; cat
* foo
* cat: -: Resource temporarily unavailable
*
* Clearing the flag makes the behavior of cat command normal.
* (cat command waits input from standard input.)
*
* % ruby -rio/nonblock -e '
* END { STDOUT.nonblock = false }
* STDOUT.write_nonblock("foo")
* '; cat
* foo
*
*/
static VALUE
rb_io_nonblock_set(VALUE io, VALUE nb)