From: Tanaka Akira Date: 2004-03-28T18:29:01+09:00 Subject: [ruby-dev:23251] Re: IO#readpartial In article <200403280656.i2S6u97e005261@sharui.nakada.niregi.kanuma.tochigi.jp>, nobu.nakada@nifty.ne.jp writes: > 対応してみました。しかし、READ_DATA_PENDING()の場合はバッファに > あるデータだけを読むというのはなんででしょうか。そのままread(2) > にいってしまうのはまずい? そのまま読むと、データが到着していない場合にそこでブロックするのでダメ です。ブロックするのは stdio のバッファも含めて一切のデータが到着して いない時だけです。 timeout が 0 な select で読めるデータがあることを確認してからというの であればあり得ます。ただ、確認してから読むまでに他のプロセスが読んでし まってブロックするかもしれないという race condition が生まれます。 というわけで、今回は安全側に振ってみました。まぁ、実装が面倒臭かったと いうのがないとはいいませんが。 あと、この race condition を許容するのであれば、第一引数の integer を 省略できるようにするという可能性もあります。その場合、省略すると到着し ているデータをすべて読み込むという仕様になるでしょう。 仕様といえば、あと EOF に出会った時に nil と EOFError のどちらにするか という選択肢もありますね。現在のは nil にしてありますが、read* という 名前から考えると EOFError という気もします。 -- [田中 哲][たなか あきら][Tanaka Akira]