なひです.

> From: Keisuke Minami [mailto:keisuke / rccn.com]
> Sent: Friday, June 11, 1999 5:11 PM

> Threadを使ったプログラムの中で
> HUPシグナルを受けとってあるファイルを読み直すという
> プログラムを作ったのですがどうしてもうまく動きません。
> HUPシグナルを受けとっても予想通りの反応をしないんです。

先ほどruby-devに投げましたが,[ruby-dev:7172]
どうやらthreadとは無関係のようです.

> HUPシグナルを送ると以下の2パターンのようになります。
> 
> パターン1
> HUPを受け取ったという表示が出るのだが
> ファイルの読み込みができないで止まるケース
> この場合は confh.each do |l| で止まっているようです。

これは2度目以降のSIGHUPで止まる,という現象ではないでしょうか.
でしたら,[ruby-dev:7172]と根は同じだと思います.

> パターン2
> HUPを受け取ったという表示がないまま、
> メインのmの表示が続くのだが、スレッドの方の表示tがでなくなるケース

これはまつもとさんからもあった通り,
子スレッドがSIGHUPを受けて死んでしまっている,
ということかもしれません.
SIGPIPEは任意のスレッドに飛んで欲しいですが,
SIGHUPはメインスレッドに飛んで欲しいな...
と思うんですが,確かこのネタは,
なひがその根拠を示さないといけないことになっているような気がします.^^;;;

> これはrubyのバグなのか、そうでなければ
> どのように解決したらいいのかを教えていただきたいのですが。

まずこのスクリプトでは,最初のSIGHUPが子スレッドに飛んで,
そのsignal handler中で次のスレッドを生成してます.が,これだと,
生成されたスレッドにおいては
signal handlerが設定されていないような気がします.
ちょっと構造を見直した方がいいかもしれませんね
(おそらく元スクリプトはもっと複雑なんでしょうね.^^;)

そこで,スクリプトを組み替えて,
ちゃんとメインスレッドがSIGHUPを受けられるようになったとしても,
もし[ruby-dev:7172]が正しければ,
やっぱりeachで止まることになると思います.
一度目のsignal handlerをぬけた後,
なんとかしてerrnoをリセットしないといけませんです.
1.2系は既にFIXしてますので,なんとか手を考えないといけませんね...

例えば,存在しないファイルをオープンしてみて,
errnoをENOENTに化けさせるとか...
これなら動きます.当然ながら,お勧めしません.
ruby hackerのみなさんの,よりよい回避策を募集します.^^;

p $$

def doSomething( name )
  fh = File.open( name, "r" )
  fh.each do |l|
    p l
  end
  fh.close()
  print "done\n"
end

trap("HUP") {
  p "receive HUP"
  doSomething( "conf" )
  p "...finished."
}

$stdout.sync = true
loop do
  sleep(1)
  begin
    open( "nosuchfileoredirectory" )
  rescue
    # do nothing
  end
end