Ruby 我如何重播SIGINT?
我目前拥有的:Ruby 我如何重播SIGINT?,ruby,signals,Ruby,Signals,我目前拥有的: trap "SIGINT" do case ENV["MODE"] when "A" ... when "B" ... end end 如果我想在未设置ENV[“MODE”]时没有陷阱,我会: trap "SIGINT" do case ... end end if ENV["MODE"] 但如果我想传递一个特定值的陷阱呢 trap "SIGINT" do case ENV["MODE"] when "A" ..
trap "SIGINT" do
case ENV["MODE"]
when "A"
...
when "B"
...
end
end
如果我想在未设置ENV[“MODE”]
时没有陷阱,我会:
trap "SIGINT" do
case
...
end
end if ENV["MODE"]
但如果我想传递一个特定值的陷阱呢
trap "SIGINT" do
case ENV["MODE"]
when "A"
...
when "B"
...
when "C"
# here I want to really do a SIGINT
else
# or here
end
end
请
请按照@ndn的建议在案例中定义陷阱
或如果
的话,而不是相反
取消定义陷阱trap
注意:这只是一个概念证明强>
调用Process.kill('INT',Process.pid)
内部时,“C”
会再次陷入陷阱。您需要先取消定义trap
。从:
如果命令是“DEFAULT”或“SIG_DFL”,则Ruby的默认处理程序
将被调用
下面是一个例子:
trap "SIGINT" do
mode = %w(A B C D).sample
puts "Sigint with mode : #{mode}"
case mode
when "A"
puts "A, not exiting"
when "B"
puts "B, not exiting"
when "C"
puts "C, exiting"
trap "SIGINT", "DEFAULT"
Process.kill('INT', Process.pid)
else
puts "D, exiting"
trap "SIGINT", "DEFAULT"
Process.kill('INT', Process.pid)
end
end
while true
sleep 0.1
p "+1"
end
它输出:
"+1"
"+1"
"+1"
^CSigint with mode : A
A, not exiting
"+1"
"+1"
"+1"
"+1"
"+1"
"+1"
^CSigint with mode : C
C, exiting
trap_sigint.rb:21:in `sleep': Interrupt
from trap_sigint.rb:21:in `<main>'
它输出
"+1"
"+1"
^CSigint with mode : A
A, not exiting
"+1"
"+1"
"+1"
"+1"
^CSigint with mode : B
B, not exiting
"+1"
"+1"
"+1"
"+1"
^CSigint with mode : D
D, exiting
预期的行为是什么?为什么不将if-ENV['MODE']
替换为if['A','B']。包括ENV['MODE']
?但要回答您的问题-Process.kill('INT',Process.pid)
@EricDuminil,其工作方式类似于从rescue之间调用raise
。。。end
@ndn:您修改的if
可能是最好的解决方案。我认为Process.kill('INT',Process.pid)
会再次被陷阱抓住,不过。@EricDuminil,是的,是有道理的。
"+1"
"+1"
^CSigint with mode : A
A, not exiting
"+1"
"+1"
"+1"
"+1"
^CSigint with mode : B
B, not exiting
"+1"
"+1"
"+1"
"+1"
^CSigint with mode : D
D, exiting