当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby IO.read_nonblock用法及代码示例


本文简要介绍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-lang.org大神的英文原创作品 IO.read_nonblock。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。