Techioz Blog

Signal.trap の設定を解除するにはどうすればよいですか?

概要

割り込み時に停止したいループがあるのですが、これを実行すると、元の動作が失われます。割り込みの動作を一時的に変更し、その後、通常どおりに動作できるように設定し直すにはどうすればよいですか?

stop = false
trap = Signal.trap('INT') { stop = true } # returns "DEFAULT"
loop do
  break if stop
end
Signal.trap('INT') { trap } # <-- does not work

私はできることを知っています:

Signal.trap('INT') do
  stop = true
  exit
end

しかし、むしろデフォルトの動作にさせたいのですが…どうすればよいでしょうか?

解決策

明示的に「デフォルト」の動作に設定できると思います。例を示します。

stop = false
Signal.trap("INT") { stop = true }
loop do
  break if stop
end

loop do
  # have to ctrl-\ to exit
  p "stuck forever"
  sleep 1
end
stop = false
Signal.trap("INT") { stop = true }
loop do
  break if stop
end

Signal.trap("INT", "DEFAULT")
loop do
  # ctrl-c now works
  p "not stuck forever"
  sleep 1
end

https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://ruby-doc.org/3.3.0/Kernel.html#method-i-trap