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