module function Signal.#trap

trap(signal, command) -> String | Proc | nil[permalink][rdoc]
trap(signal) { ... } -> String | Proc | nil

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

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

[PARAM] signal:
シグナル名を表す文字列か Symbol、またはシグナル番号を指定します。さらに特別な値として 0 または "EXIT" が指定できます。これは「プログラムの終了時」を表します。
[PARAM] command:
シグナルハンドラとして Ruby プログラムを表す文字列か Proc オブジェクト、また次に挙げる文字列を指定します。nil、空文字列""、"SIG_IGN" または"IGNORE" を指定した時は、可能ならばそのシグナルを無視します。 "SIG_DFL" または "DEFAULT" を指定した時は、シグナルハンドラをデフォルトに戻します。 "EXIT"を指定した時は、シグナルを受け取ると終了処理を行ったあとステータス 0 で終了します。文字列の代わりに Symbol で指定することも出来ます。
[EXCEPTION] ArgumentError:
引数 signalに SEGV BUS ILL FPE VTALRM を指定した場合に発生します。また、システムに定義されていないシグナルを引数 signal に指定した場合に発生します。例えばネイティブな Windows システム (mswin32, mingw など) で動く ruby では INT ILL FPE SEGV TERM BREAK ABRT EXIT しか定義されていません。

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

例:

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"


Signal.trap(0, proc { puts "Terminating: #{$$}" })
Signal.trap("CLD")  { puts "Child died" }
fork && Process.wait

# => Terminating: 13939
# => Child died
# => Terminating: 13907

[SEE_ALSO] 終了処理