如何在不读取IO的情况下知道IO是否为空?

时间:2014-09-16 08:35:57

标签: ruby io

我有IO个对象(例如$stdout$stderr)。我可以在它上面read.empty?查看它是否为空,但是如果不读它就可以知道它是否为空?我知道Filesize,但IO没有。{/ p>

修改 对不起,如果我的问题不够明确。我将这些对象作为Open3.popen3的返回值。我想看看是否有任何内容写入标准错误,例如。如果可能的话,我想在不阅读的情况下这样做。

1 个答案:

答案 0 :(得分:2)

这是IO::select方法的目的:

编辑问题后的更新示例:

require 'open3'

select_timeout = Rational(1,10) # optional

Open3.popen3('ls /') do
  |stdin, stdout, stderr, w_thread|

  rdin, rdout, rderr = IO.select([stdin], [stdout], [stderr], select_timeout)
  if rdin
    p 'no data on standard input' unless rdin.member? stdin
    p 'no data on standard output' unless rdout.member? stdout
    p 'no data on standard error' unless rderr.member? stderr
  else
    p 'none of streams has data available'
  end

  retval = w_thread.value
end
# "no data on standard output"
# "no data on standard error"

而只有标准输入包含来自衍生线程命令ls /

的数据