14

基本的にこれであるRubyのメソッドを探しています:

io.ready_for_read?

IO特定のオブジェクト (私の場合は呼び出しの結果) に出力があるかどうかを確認したいだけですpopen。つまり、フォローアップ呼び出しio.read(1)がブロックされません。

これらは私が見る 2 つのオプションですが、どちらも好きではありません。

  1. io.read_nonblock- Unix の抽象化が薄すぎる --エラー処理を扱いread()たくありません。errno

  2. io.selectwith timeout 0 -- この単純な操作の目的を曖昧にします。

私が見落としていたより良い代替手段はありますか?

4

3 に答える 3

9

少し遅れましたがrequire 'io/wait'、 を使用ready?して、IO をブロックせずに読み取れることを確認できます。確かに、どれだけ読み取るつもりか (およびどのように読み取るか) によっては、IO オブジェクトがまだブロックされる可能性がありますが、これは役立つはずです。このライブラリがすべてのプラットフォームでサポートされているかどうかはわかりません。また、この機能が他の IO ライブラリから分離された理由もわかりません。詳細はこちら: http://ruby-doc.org/stdlib/libdoc/io/wait/rdoc/

于 2009-11-16T14:50:58.347 に答える
0

Windows では、 IO/waitとの矛盾がいくつか見られました。私が今ここに持っているルビーは次のとおりです。

ルビー 1.9.2p136 (2010-12-25) [i386-mingw32]

これで、nread準備ができましたか?実装されていますが、誤った結果を返します。私が使用していた別のバージョンで準備ができていますか? まだ壊れていて、nreadも存在しませんでした。

1 つの可能性はio.stat.sizeを使用することです。これは、IO ストリームで読み取ることができるバイト数を示します。 http://www.ruby-doc.org/core/classes/File/Stat.html

ドキュメントはファイル用であると示唆していますが、私は別のプロセスに接続されたパイプで使用しました (Ruby の Open3.popen3 を介して)。これまでのところうまくいきました。

于 2011-02-16T21:42:32.717 に答える