kind=defined
names=trap
visibility=public

--- 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 で終了します。

@raise ArgumentError システムに定義されていないシグナルを trap に指定した場合に
                     発生します。例えばネイティブな 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

例:

  p Signal.trap(:INT, "p true")       # => nil
  p Signal.trap(:INT) { p false }     # => "p true"
  p Signal.trap(:INT, proc{ p nil })  # => #<Proc:0x403951a8>
  p Signal.trap(:INT, "SIG_IGN")      # => #<Proc:0x401b1328>
  p Signal.trap(:INT, "DEFAULT")      # => nil
  p Signal.trap(:INT, "EXIT")         # => nil
  p Signal.trap(:INT, nil)            # => "EXIT"

@see [[d:spec/terminate]]
