我正在寻找 Ruby 中的一种方法,基本上是这样的:
io.ready_for_read?
我只想检查给定IO
对象(在我的例子中,popen
调用的结果)是否有可用的输出,即后续调用io.read(1)
不会阻塞。
这是我看到的两个选项,我都不喜欢:
io.read_nonblock
- Unix 的抽象太薄了read()
- 我不想处理errno
错误处理。io.select
with timeout 0 -- 混淆了这个简单操作的目的。
有没有我忽略的更好的选择?
我正在寻找 Ruby 中的一种方法,基本上是这样的:
io.ready_for_read?
我只想检查给定IO
对象(在我的例子中,popen
调用的结果)是否有可用的输出,即后续调用io.read(1)
不会阻塞。
这是我看到的两个选项,我都不喜欢:
io.read_nonblock
- Unix 的抽象太薄了read()
- 我不想处理errno
错误处理。
io.select
with timeout 0 -- 混淆了这个简单操作的目的。
有没有我忽略的更好的选择?
有点晚了,但是如果你require 'io/wait'
,你可以使用ready?
来验证 IO 可以被读取而不阻塞。当然,取决于您打算阅读多少(以及您打算如何阅读),您的 IO 对象可能仍会阻塞,但这应该会有所帮助。我不确定这个库是否在所有平台上都受支持,我也不知道为什么这个功能与 IO 库的其余部分是分开的。在此处查看更多信息:http ://ruby-doc.org/stdlib/libdoc/io/wait/rdoc/
我已经准备好得出结论,不,没有简单的方法可以做到这一点。根据彼得库珀的建议,这里是IO#ready_for_read?
:
class IO
def ready_for_read?
result = IO.select([self], nil, nil, 0)
result && (result.first.first == self)
end
end
在 Windows 上,我看到了一些与IO/wait不一致的地方。我现在这里的红宝石是:
红宝石 1.9.2p136 (2010-12-25) [i386-mingw32]
在这个既nread又准备好了吗?已实现,但它们返回错误的结果。在我正在使用的不同版本上准备好了吗?仍然被破坏,甚至nread都不存在。
一种可能性是使用io.stat.size,它告诉您在 IO 流中可读取的字节数。 http://www.ruby-doc.org/core/classes/File/Stat.html
文档表明它是用于文件的,但我已经在连接到单独进程的管道上使用它(通过 Ruby 的 Open3.popen3)。到目前为止它对我有用。