ある単純な方法の確認を行うためのRubyのIOインスタンスブロックにread()?

StackOverflow https://stackoverflow.com/questions/930989

質問

なんと、通常の方法にRubyは基本的にはこの:

io.ready_for_read?

ていただきたいと思いるかどうかチェックされ IO オブジェクト(私の場合、結果の popen 電話)は、出力、すなわちフォローアップとして、また電話 io.read(1) まずブロックです。

これらのオプションに見ても難しい問題になるかもしれないように:

  1. io.read_nonblock -薄すぎ抽象化のUnix read() --ならないようにしたい対応 errno エラー処理する。

  2. io.select とのタイムアウト0--obfuscatesことを目的に操作といいます。

がより良い代替として見逃?

役に立ちましたか?

解決

少し遅れて、しかし、あなたがrequire 'io/wait'場合は、IOはブロックせずに読み込むことができることを確認するためにready?を使用することができます。あなたのIOオブジェクトがまだブロックすることがありますが、これは役立つはずあなたが読んで(とどのようにあなたがそれを行う予定)に予定がどのくらいに応じて、付与されました。このライブラリは、すべてのプラットフォームでサポートされている場合、私はわからない、とこの機能は、IOライブラリの残りの部分から分離された理由を、私も知りません。もっとここを参照してください: http://ruby-doc.org/stdlib/libdoc/ IO /待っ/ 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.Rubyしていまここには:

ruby1.9.2p136(2010-12-25)[i386-mingw32]

この一両 nreadいうことですか? を実施し、それを返し誤った。異なったバージョンを使用した いうことですか? したが壊れて nread なかったものが存在します。

一つの可能性は io.stat.サイズ, は、分かるのに利用できるバイト数を読み込む場IOストリームです。http://www.ruby-doc.org/core/classes/File/Stat.html

の文書このファイルのものに使用しましたので配管の接続には別のプロセス(RubyのOpen3.popen3).また私にとっています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top