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


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