names=trap
visibility=public
kind=defined

--- trap(signal, command)    -> String | Proc | nil
--- trap(signal) { ... }     -> String | Proc | nil

指定された割り込み signal に対するハンドラとして
command を登録します。
指定したシグナルが捕捉された時には例外が発生せず、代わりに command が実行されます。
ブロックを指定した場合にはブロックをハンドラとして登録します。

trap は前回の trap で設定したハンドラを返します。
文字列を登録していた場合はそれを、
ブロックを登録していたらそれを [[c:Proc]] オブジェクトに変換して返します。
また何も登録されていないときも nil を返します。
ruby の仕組みの外でシグナルハンドラが登録された場合
(例えば拡張ライブラリが独自に sigaction を呼んだ場合など)
も nil を返します。

@param signal シグナル名を表す文字列か [[c:Symbol]]、またはシグナル番号を指定します。
              さらに特別な値として 0 または "EXIT" が指定できます。
              これは「プログラムの終了時」を表します。

@param command シグナルハンドラとして Ruby プログラムを表す文字列か Proc オブジェクト、また次に挙げる文字列を
               指定します。nil、空文字列""、"SIG_IGN" または"IGNORE" を指定した時は、
               可能ならばそのシグナルを無視します。
               "SIG_DFL" または "DEFAULT" を指定した時は、シグナルハンドラをデフォルトに戻します。
               "EXIT"を指定した時は、シグナルを受け取ると終了処理を
               行ったあとステータス 0 で終了します。
               文字列の代わりに [[c:Symbol]] で指定することも出来ます。

@raise ArgumentError システムに定義されていないシグナルを引数 signal に
                     指定した場合に発生します。
                     例えばネイティブな Windows システム (mswin32,
                     mingw など) で動く ruby では INT ILL FPE SEGV
                     TERM BREAK ABRT EXIT しか定義されていません。

いくつかのシグナルに対して、Ruby インタプリタは例外 [[c:Interrupt]] や
[[c:SignalException]] を発生させます。このようなシグナルは例外処理によっ
て捕捉することもできます。

例:

  begin
    Process.kill :QUIT, $$   # 自身にSIGQUITを送信
  rescue SignalException
    puts "rescue #$!"
  end
  # => rescue SIGQUIT

例:

  Signal.trap(:INT, "p true")       # => "DEFAULT"
  Signal.trap(:INT) { p false }     # => "p true"
  Signal.trap(:INT, proc{ p nil })  # => #<Proc:0x8e45ae0@-:2>
  Signal.trap(:INT, "SIG_IGN")      # => #<Proc:0x8e45914@-:3>
  Signal.trap(:INT, "DEFAULT")      # => "IGNORE"
  Signal.trap(:INT, "EXIT")         # => "DEFAULT"
  Signal.trap(:INT, nil)            # => "EXIT"

@see [[d:spec/terminate]]

