當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。