• 締切済み

バッファの上限なしでreadpartialするにはどうしたらいいですか?

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

みんなの回答

  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.3

すいません。マニュアルの読みが足らず&試さずに回答していました。 システムコールreadの引数になるので、サイズはlong intの範囲でなおかつそのサイズのメモリエリアが確保できないと駄目ですね。 >それとできればデータを途切れさせずに一度に受け取りたいんです。 えーと、readpartialは名前の通り、途切れながら受け取るメソッドですけど。 もしかして、read_nonblockと間違えてますか?いずれにせよ、システムコールのreadを生に呼び出すので、サイズ指定は必須です。 ノンブロッキングでリードするという代わりに、selectを使ったらどうでしょう? サンプル: f = 何らかのIOオブジェクト if IO.select([f],[],[],0) data = f.read # データがあった else puts "データがまだ来ない" end

RekCah1991
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.2

>やっぱりそういう手段しか無いですか なぜ上限無しにこだわるのかさっぱりわかりませんでしたが、多分、プログラム中にマジックナンバーを埋め込みたくないと言うことですね。 2**64 とかにしておけば無制限という意味明瞭だと思いますけど。 あるいは、定数定義するか。整数値の上限がないだけに逆に難しいですね。

RekCah1991
質問者

お礼

大体そんな感じです。 それとできればデータを途切れさせずに一度に受け取りたいんです。 あと引数の数字がでかすぎるとRangeErrorになってしまうみたいです。

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.1

syncは出力のバッファリングなので、入力のブロックとは関係ないですよね。 >バッファの上限なしでreadpartialするにはどうしたらいいですか 非常に大きな数字、例えば 10**10 とかを指定すればいいのでは?

RekCah1991
質問者

お礼

出力だったんですか。 知りませんでした。 やっぱりそういう手段しか無いですか ありがとうございます

すると、全ての回答が全文表示されます。

関連するQ&A