2

这是我编写的一些代码的简化版本:

class InfiniteLoop
  def run
    trap('SIGTERM') do
      puts 'exiting'
      exit
    end
    loop {}
  end
end

如果我运行:

InfiniteLoop.new.run

我可以ctrl+c得到:

exiting

但是,当我这样做时:

t = Thread.new { InfiniteLoop.new.run }
sleep 1
t.terminate

我没有看到:

exiting

有人可以在这里指出我正确的方向吗?我希望在终止线程时具有相同的行为。

4

3 回答 3

5

如果您没有发送 SIGTERM 信号(通过 ctrl+c),则不会执行陷阱块。另见内核方法:

at_exit { puts 'exiting' }
于 2012-12-13T00:13:10.807 回答
3

trap('SIGTERM')只会响应从 OS Land 发送的信号。

Thread#terminate是会杀死线程的红宝石代码。

我不知道有一种方法可以指定线程在被杀死之前要采取的行为。那可能很有趣。但我认为它不存在,因为 的语义Thread#kill/terminate/join不会真正允许这样做。

于 2012-12-13T00:53:51.367 回答
0

试试trap("EXIT")。SIGTERM 由 ctrl-C 或 kill 命令发送。来自红宝石文档:

将在程序终止之前调用特殊信号名称“EXIT”或信号编号零。

于 2013-08-04T11:14:03.420 回答