首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重新抛出SIGINT?

如何重新抛出SIGINT?
EN

Stack Overflow用户
提问于 2017-01-16 22:28:34
回答 1查看 165关注 0票数 1

我目前所拥有的:

代码语言:javascript
复制
trap "SIGINT" do
  case ENV["MODE"]
  when "A"
    ...
  when "B"
    ...
  end
end

如果我不想在没有设置ENV["MODE"]的情况下有陷阱,我会这样做:

代码语言:javascript
复制
trap "SIGINT" do
  case
    ...
  end
end if ENV["MODE"]

但是,如果我想要传递一个特定值的陷阱怎么办?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2017-01-17 01:26:44

请遵循@ndn的建议在caseif中定义trap,而不是相反。

取消定义trap

注意:这只是一个概念证明!

when "C"内部调用Process.kill('INT', Process.pid)只会再次在trap中被捕获。您需要先取消定义trap。在documentation中:

如果命令为“default”或“SIG_DFL”,则将调用

的默认处理程序。

下面是一个例子:

代码语言:javascript
复制
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

它输出:

代码语言:javascript
复制
"+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>'

使用exit

这是不同的信号,但如果您只想在模式为"C“或"D”时停止执行脚本,则可以使用exit而不是SIGINT

代码语言:javascript
复制
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"
    exit
  else
    puts "D, exiting"
    exit
  end
end

while true
  sleep 0.1
  p "+1"
end

它的输出

代码语言:javascript
复制
"+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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41678653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档