Ruby での thread およびシグナル処理を練習するために、
http://www.ruby-lang.org/ja/man-1.4/socket.html#TCPServer
にあった TCPServer を使った echo サーパのサンプル(Thread 版)を
元にして下記のスクリプトを動かしてみました。

#--- test-signal.rb ここから ------------------------------
trap("HUP") {print "SIGHUP!\n"}     # この一行を追加しただけ

require "socket"

gs = TCPServer.open(0)
addr = gs.addr
addr.shift
printf("server is on %d\n", addr.join(":"))

while TRUE
  ns = gs.accept
  print(ns, " is accepted\n")
  Thread.start do
    s = ns                      # save to dynamic variable
    while s.gets
      s.write($_)
    end
    print(s, " is gone\n")
    s.close
  end
end
#--- test-signal.rb ここまで ------------------------------

上記スクリプトを起動した後、 シェルから "kill -HUP pid" というコマンド
を実行して SIGHUP を送ると、「SIGHUP!」と標準出力に表示されます。ここ
までは期待通りの動作をしてくれます。

しかし、上記サーバに対して telnet で接続して echo サーバとして動作する
か試した後に、もう一度 SIGHUP を送ると、

SIGHUP!
./test-signal.rb:20: [BUG] Segmentation fault

と出て、 core dump してしまいます。

これは、私の thread & trap の使い方が悪いのが原因なのでしょうか? 
accept 中にシグナルを送ろうとするのが間違っているのでしょうか?
それとも、エラーメッセージ通りに、Ruby の BUG なんでしょうか?

ちなみに、thread を使わない TCPServer のサンプル(非 Thread 版)で
同様に試したところ、上記のような問題は発生しませんでした。
だから、Thread 版を使わない、という逃げをうつことはできます。
しかし、Thread を使った場合の簡潔さに魅せられた私としては、
できれば Thread を使ってサーバを書きたいのです。

実行環境は、
$ ruby --version
ruby 1.4.3 (1999-12-08) [sparc-solaris2.6]
$ uname -a
SunOS ccz03 5.6 Generic_105181-15 sun4u sparc SUNW,Ultra-4
こうなっています。

-- 
平井 幸夫 (ひらい ゆきお)