NetBSD 2.0 で WEBrick を使って HTTP サーバを動かした場合、クライアント がリクエストした後データを受け取らないことにより、サーバプロセス全体を ブロックさせてしまうことができるようです。 | server% cd sample/webrick | server% ../../ruby -e 'print "a" * 100000' > z 100000bytes のファイルを作ります。 | server% ../../ruby httpd.rb | [2005-06-30 00:51:50] INFO WEBrick 1.3.1 | [2005-06-30 00:51:50] INFO ruby 1.9.0 (2005-06-28) [i386-netbsdelf2.0] | [2005-06-30 00:51:50] DEBUG TCPServer.new(::, 10080) | [2005-06-30 00:51:50] DEBUG TCPServer.new(0.0.0.0, 10080) | [2005-06-30 00:51:50] DEBUG WEBrick::HTTPServlet::FileHandler is mounted on /. | [2005-06-30 00:51:50] DEBUG HelloServlet is mounted on /hello. | [2005-06-30 00:51:50] DEBUG DemoServlet is mounted on /urlencoded. | [2005-06-30 00:51:50] DEBUG DemoServlet is mounted on /multipart. | [2005-06-30 00:51:50] INFO WEBrick::HTTPServer#start: pid=3354 port=10080 sample/webrick/httpd.rb を起動します。 | client% ./ruby -rsocket -e 'TCPSocket.open("localhost", 10080) {|s| | s.print "GET /z HTTP/1.0\r\n\r\n" | sleep | }' 他の window から z をリクエストしてデータを受け取らないクライアントを動かします。 | [2005-06-30 00:52:09] DEBUG accept: ::1:57998 | [2005-06-30 00:52:09] DEBUG WEBrick::HTTPServlet::FileHandler is invoked. するとサーバは上の 2行を出力します。 | client2% telnet localhost 10080 | Trying ::1... | Connected to localhost. | Escape character is '^]'. | GET / HTTP/1.0 | | ここでさらに他の window からリクエストを送っても反応しません。 まぁ、よーするに write でブロックしてるわけですが... -- [田中 哲][たなか あきら][Tanaka Akira]