From: Masaki Fukushima Date: 1999-09-17T11:54:14+09:00 Subject: [ruby-dev:7858] Re: socket and buffering 福嶋です。 matz@netlab.co.jp (Yukihiro Matsumoto) wrote: > |以下のような環境で調べたところ、Socket#read (中ではfread(3)が呼ば > |れる)を使うと、やはり 1 byte づつの read になってしまいます。 > > うーむ、そうですか。 > > どうやって回避するのがベストなんでしょうねえ。 > O_NDELAY+read(2)しかないのか.. ちょっと整理してみましょう。 問題になっているのはunbufferedなIOオブジェクト(主にSocket)か らの読み込みが、sysread以外のメソッドで1byteずつのread(2)になって しまうことです。 まず改善の方針として 1. IO#readで改善されれば良い。 2. 他のメソッド(IO#getsなど)でも改善したい。 があります。 IO#readだけ改善されれば良いのならば、fread(3)を使っている部分を 、unbufferedな場合に限りrb_thread_wait_fd()+read(2)で置き換えると いう方法が一番楽でしょうか。 元々stdioでバッファリングをoffにしているので、stdioをバイパスして も問題は無いでしょう。 IO#read以外も改善しようとすると、結構大変ですね。何byte読み込めば いいのか事前に分からないので、1byteずつread(2)する以外だと、結局 バッファリングするしか無いですし。 その場合はunbufferedにしないでO_NDELAYを使うという方法でしょうか。 --- 福嶋正機