下面是我写的一些代码的简化版本:
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
有人能给我指出正确的方向吗?我希望在终止线程时有相同的行为。
发布于 2012-12-13 08:13:11
如果您没有发送信号(通过ctrl+c),则不会执行陷阱块。另请参阅内核方法:
at_exit { puts 'exiting' }
发布于 2012-12-13 08:53:51
trap('SIGTERM')
将只对从OS平台发送的信号作出响应。
Thread#terminate
是会杀死线程的ruby代码。
我不知道有什么方法可以指定线程在被终止前采取的行为。这可能很有趣。但我不认为它存在,因为Thread#kill/terminate/join
的语义不会真正允许这样做。
发布于 2013-08-04 19:14:03
试试trap("EXIT")
。SIGTERM由ctrl-C或kill命令发送。来自ruby文档:
特殊信号名称“EXIT”或信号编号0将在程序终止之前调用。
https://stackoverflow.com/questions/13850554
复制相似问题