本文簡要介紹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 IO.write用法及代碼示例
- Ruby IO.eof用法及代碼示例
- Ruby IO.read用法及代碼示例
- Ruby IO.fileno用法及代碼示例
- Ruby IO.pread用法及代碼示例
- Ruby IO.raw用法及代碼示例
- Ruby IO.readlines用法及代碼示例
- Ruby IO.to_i用法及代碼示例
- Ruby IO.self << object用法及代碼示例
- Ruby IO.tty?用法及代碼示例
- Ruby IO.close_write用法及代碼示例
- 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 IO.pathconf用法及代碼示例
- Ruby IO.sysseek用法及代碼示例
- Ruby IO.closed?用法及代碼示例
- Ruby IO.sync =用法及代碼示例
注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 IO.write_nonblock。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。