ごとうゆうぞうです。
対応が遅くなって済みません。

In message <87d5q5xicd.fsf / m17n.org>,
 `Tanaka Akira <akr / m17n.org>' wrote:
> NetBSD 2.0 で WEBrick を使って HTTP サーバを動かした場合、クライアント
> がリクエストした後データを受け取らないことにより、サーバプロセス全体を
> ブロックさせてしまうことができるようです。

> まぁ、よーするに write でブロックしてるわけですが...

デフォルトでソケットにO_NONBLOCKを設定するようにしようと思い
ます。

この影響なのですが、1.9については[ruby-dev:25101]にあるように、

  nonblocking mode で IO#read を使用した場合、EAGAIN に出会っ
  ても即座には返らず、blocking mode と同様に指定した長さに達
  するまで読むようになりました。これは[ruby-dev:17866] での
  判断とは異なります。

ということなら問題なさそうです。1.8では、[ruby-dev:17866]の

  * getsなど行指向入力はEWOULDBLOCKを無視
  * read系はEWOULDBLOCKがきたらすでに読み込んだぶんを文字列
    で返す。

に従うと、getsについては特に対処は必要なく、readについては希
望する長さのデータが得られるまで繰り返し呼び出すということに
なるでしょうか。

WEBrickは (chunkedのリクエストを読む時を除いて) 既にそのよう
にコーディングされているので、acecptの直後に呼ばれるフックを
利用することで現状でもこの問題を回避できそうです。

  require "webrick"
  accept_callback = Proc.new{|sock|
    flag = File::NONBLOCK
    flag |= sock.fcntl(Fcntl::F_GETFL) if defined?(Fcntl::F_GETFL)
    sock.fcntl(Fcntl::F_SETFL, flag)
  }
  httpd = WEBrick::HTTPServer.new(
    :DocumentRoot   => File::dirname(__FILE__),
    :Port           => 10080,
    :AcceptCallback => accept_callback
  )
  trap(:INT){ httpd.shutdown }
  httpd.start

-- 
ごとうゆうぞう