From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1998-04-16T15:25:40+09:00 Subject: [ruby-dev:2369] Re: [Problem] thread and signal and sleep けいじゅ@日本ラショナルソフトウェアです. In [ruby-dev :2367 ] the message: "[ruby-dev:2367] Re: [Problem] thread and signal and sleep ", on Apr/16 14:54(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >|うーん,そうか.今調べたらOSレベルのスレッドだとトラップによっ >|て発生したシグナルはそのスレッドに届けられるみたいですね. > >昨夜考えてみたら,とはいうもののたとえばSIGPIPEのハンドラに >今読み込んでいるソケットを直接教える方法はないので,グローバ >ル変数かなにかを経由することになると思うのですが,それだと別 >にカレントスレッドである積極的な理由は無いですよね. そんなことないですよ. Thread.start { s = sock trap("SIGPIPE") { # sの処理 } ... } でも, スレッド毎にシグナルハンドラが設定できないとだめですね... SIGPROCS = {} trap("SIGPIPE") { if p = SIGPROCS[Thread.current] p.call else # デフォルトの動作 end } Thread.start { s = sock SIGPROCS[Thread.current] = proc{ #sの処理 } ... } とすればいいかな. これだと, シグナル処理がスレッドごとに局所化されます からいろいろ仕えそうですね. >とはいうものの,カレントスレッドに届くというのはruby的にもそ >れなりに意味がありそうなので再びそのようにします. 了解しました. ># 明示的にハンドラを指定しないSIGINTは例外でメインスレッドに ># 届きます(これは昔から). どうしてSIGINTだけなんでしょう? >ただ,以前はカレントスレッドが既に終了しているとき(かつ,他 >の全てのスレッドがstopしている時),もう死んでしまったスレッ >ドにシグナルを送っていましたが,これは修正します. あ. そうそう1つ聞きたいことがあったんでした. 1つ以外のスレッドが全部Thread.stopしていて, 残り1つもsleep している時 は何がカレントスレッドになるんです? __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@rational.com <<---