dポイントプレゼントキャンペーン実施中!

Rubyでノンブロッキングモードでファイルやパイプから読み込みをしたいんですが、Readpartialだと受け取るデータの長さを指定しないといけないし、
sync=trueにしてreadしてもブロックされてしまうので困っています。
知っている方教えてください

A 回答 (3件)

すいません。

マニュアルの読みが足らず&試さずに回答していました。
システムコールreadの引数になるので、サイズはlong intの範囲でなおかつそのサイズのメモリエリアが確保できないと駄目ですね。

>それとできればデータを途切れさせずに一度に受け取りたいんです。

えーと、readpartialは名前の通り、途切れながら受け取るメソッドですけど。
もしかして、read_nonblockと間違えてますか?いずれにせよ、システムコールのreadを生に呼び出すので、サイズ指定は必須です。


ノンブロッキングでリードするという代わりに、selectを使ったらどうでしょう?

サンプル:
f = 何らかのIOオブジェクト
if IO.select([f],[],[],0)
data = f.read # データがあった
else
puts "データがまだ来ない"
end
    • good
    • 0
この回答へのお礼

なるほど、ありがとうございます。
一つの関数だけにこだわりすぎてしまいました。
助かりました。

お礼日時:2010/03/13 00:26

>やっぱりそういう手段しか無いですか



なぜ上限無しにこだわるのかさっぱりわかりませんでしたが、多分、プログラム中にマジックナンバーを埋め込みたくないと言うことですね。

2**64 とかにしておけば無制限という意味明瞭だと思いますけど。
あるいは、定数定義するか。整数値の上限がないだけに逆に難しいですね。
    • good
    • 0
この回答へのお礼

大体そんな感じです。
それとできればデータを途切れさせずに一度に受け取りたいんです。

あと引数の数字がでかすぎるとRangeErrorになってしまうみたいです。

お礼日時:2010/03/12 21:37

syncは出力のバッファリングなので、入力のブロックとは関係ないですよね。



>バッファの上限なしでreadpartialするにはどうしたらいいですか
非常に大きな数字、例えば 10**10 とかを指定すればいいのでは?
    • good
    • 0
この回答へのお礼

出力だったんですか。
知りませんでした。

やっぱりそういう手段しか無いですか
ありがとうございます

お礼日時:2010/03/10 20:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!