[#37021] [RAA] RAA/2.3 — "U.Nakamura" <usa@...>

みなさんこんにちは。

20 messages 2003/01/30

[ruby-list:36901] Re: シグナルのtrapについて

From: sakazuki <QZS01353@...>
Date: 2003-01-07 03:24:16 UTC
List: ruby-list #36901
久保田さん。情報ありがとうございます。

Solarisはどうもちょっと特殊なんでしょうか?
以下で
http://www.idg.co.jp/sw/back/series/199910_02_pra.html

>   Solarisでは、POSIX標準で定められた一般的なUNIXのシグナルAPIに準拠する一方
>   で、マルチスレッド・アーキテクチャに対応するシグナル機能もサポートしている。
> 
>   従来のUNIXシステムでは、シグナルは「発生」と「実行」という2つのフェーズを
>   経て送信されていた。そのうち、発生はシグナルが最初に生成される段階を指す。
>   一方、実行は送信されたシグナルに対応するアクション(Ignoreを含む)が実際に
>   実行される段階である。もしシグナルがブロックされた場合は、実行が延期され、
>   シグナルはペンディング状態になる。
> 
>   一方、Solarisでは、「thr create(3T)」や「pthread create(3T)」ルーチンによ
>   って生成された個々のユーザー・スレッドが別々のシグナル・マスクを備えている。
>   そのため、それぞれのスレッドは同じプロセス内で動作する他のスレッドとは無関
>   係に、シグナルを自由にブロックできる。つまり、複数のスレッドがあらゆるシグ
>   ナルを個別に受信できるのである。

というような記述を見つけました。
とすると、Rubyのtrapではプロセスのシグナルのみトラップ出来て、スレッドにはシ
グナルが届いてしまうのかと思い、先程のスクリプトの後半を以下のように変更して
みました。

trap(:HUP){
  puts "Accept HUP"
  a.arg = "HUP"
}

th.join
puts "Finish"

これで、kill -HUPすると案の定
Accept HUP
Finish

と表示されて終了してしまいました。

Solarisにおけるこの挙動をうまく回避して、スレッドを止めない方法はあるでし
ょうか?


---- sakazuki(QZS01353@nifty.ne.jp)

In This Thread