本文简要介绍ruby语言中 IO.read_nonblock
的用法。
用法
read_nonblock(maxlen [, options]) → string
read_nonblock(maxlen, outbuf [, options]) → outbuf
在为底层文件说明符设置 O_NONBLOCK 后,使用 read(2) 系统调用从 ios
读取最多 maxlen
字节。
如果存在可选的 outbuf
参数,则它必须引用 String
,它将接收数据。 outbuf
将仅包含方法调用后接收到的数据,即使它一开始不为空。
read_nonblock
只是调用 read(2) 系统调用。它会导致 read(2) 系统调用导致的所有错误:Errno::EWOULDBLOCK、Errno::EINTR 等。调用者应该注意这些错误。
如果异常是 Errno::EWOULDBLOCK 或 Errno::EAGAIN,则通过 IO::WaitReadable
对其进行扩展。所以 IO::WaitReadable
可以用来挽救重试read_nonblock的异常。
read_nonblock
在 EOF 上导致 EOFError
。
在某些平台(例如 Windows)上, IO
对象不支持非阻塞模式,而不是套接字。在这种情况下,将引发 Errno::EBADF。
如果读取字节缓冲区不为空, read_nonblock
会像 readpartial 一样从缓冲区读取。在这种情况下,不调用 read(2) 系统调用。
当 read_nonblock
引发异常类型 IO::WaitReadable
时,不应该调用 read_nonblock
直到 io 可读以避免繁忙循环。这可以如下进行。
# emulates blocking read (readpartial).
begin
result = io.read_nonblock(maxlen)
rescue IO::WaitReadable
IO.select([io])
retry
end
虽然 IO#read_nonblock
不会引发 IO::WaitWritable
。 OpenSSL::Buffering#read_nonblock
可以提高 IO::WaitWritable
。如果 IO
和 SSL 应该多态使用, IO::WaitWritable
也应该被拯救。示例代码参见 OpenSSL::Buffering#read_nonblock
的文档。
请注意,此方法与 readpartial 相同,只是设置了非阻塞标志。
通过将关键字参数 exception
指定为 false
,您可以指示 read_nonblock
不应引发 IO::WaitReadable
异常,而是返回符号 :wait_readable
。在 EOF,它将返回 nil 而不是提高 EOFError
。
相关用法
- Ruby IO.read用法及代码示例
- Ruby IO.readlines用法及代码示例
- Ruby IO.readchar用法及代码示例
- Ruby IO.readpartial用法及代码示例
- Ruby IO.rewind用法及代码示例
- Ruby IO.reopen用法及代码示例
- Ruby IO.raw用法及代码示例
- Ruby IO.eof用法及代码示例
- Ruby IO.fileno用法及代码示例
- Ruby IO.pread用法及代码示例
- Ruby IO.to_i用法及代码示例
- Ruby IO.self << object用法及代码示例
- Ruby IO.tty?用法及代码示例
- Ruby IO.close_write用法及代码示例
- Ruby IO.write_nonblock用法及代码示例
- Ruby IO.set_encoding_by_bom用法及代码示例
- Ruby IO.syswrite用法及代码示例
- Ruby IO.close_read用法及代码示例
- Ruby IO.stat用法及代码示例
- Ruby IO.pwrite用法及代码示例
- Ruby IO.ungetc用法及代码示例
- Ruby IO.noecho用法及代码示例
- Ruby IO.new用法及代码示例
- Ruby IO.sysopen用法及代码示例
- Ruby IO.try_convert用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 IO.read_nonblock。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。