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


Ruby IO.write_nonblock用法及代碼示例


本文簡要介紹ruby語言中 IO.write_nonblock 的用法。

用法

write_nonblock(string) → integer
write_nonblock(string [, options]) → integer

在為底層文件說明符設置 O_NONBLOCK 後,使用 write(2) 係統調用將給定字符串寫入ios

它返回寫入的字節數。

write_nonblock 隻是調用 write(2) 係統調用。它會導致 write(2) 係統調用導致的所有錯誤:Errno::EWOULDBLOCK、Errno::EINTR 等。結果也可能小於string.length(部分寫入)。調用者應該關心這些錯誤和部分寫入。

如果異常是 Errno::EWOULDBLOCK 或 Errno::EAGAIN,則通過 IO::WaitWritable 對其進行擴展。所以 IO::WaitWritable 可以用來挽救重試write_nonblock的異常。

# Creates a pipe.
r, w = IO.pipe

# write_nonblock writes only 65536 bytes and return 65536.
# (The pipe size is 65536 bytes on this environment.)
s = "a" * 100000
p w.write_nonblock(s)     #=> 65536

# write_nonblock cannot write a byte and raise EWOULDBLOCK (EAGAIN).
p w.write_nonblock("b")   # Resource temporarily unavailable (Errno::EAGAIN)

如果寫入緩衝區不為空,則首先刷新。

write_nonblock 引發異常類型 IO::WaitWritable 時,不應該調用 write_nonblock 直到 io 可寫以避免繁忙循環。這可以如下進行。

begin
  result = io.write_nonblock(string)
rescue IO::WaitWritable, Errno::EINTR
  IO.select(nil, [io])
  retry
end

請注意,這並不能保證將所有數據寫入字符串。寫入的長度作為結果報告,稍後應檢查。

在某些平台(例如 Windows)上,根據 IO 對象的類型,不支持 write_nonblock 。在這種情況下, write_nonblock 引發 Errno::EBADF

通過將關鍵字參數 exception 指定為 false ,您可以指示 write_nonblock 不應引發 IO::WaitWritable 異常,而是返回符號 :wait_writable

相關用法


注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 IO.write_nonblock。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。