首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Thread#terminate与处理SIGTERM

Thread#terminate与处理SIGTERM
EN

Stack Overflow用户
提问于 2012-12-13 07:36:59
回答 3查看 4.1K关注 0票数 2

下面是我写的一些代码的简化版本:

代码语言:javascript
运行
复制
class InfiniteLoop
  def run
    trap('SIGTERM') do
      puts 'exiting'
      exit
    end
    loop {}
  end
end

如果我运行:

代码语言:javascript
运行
复制
InfiniteLoop.new.run

我可以ctrl+c并获取:

代码语言:javascript
运行
复制
exiting

然而,当我这样做的时候:

代码语言:javascript
运行
复制
t = Thread.new { InfiniteLoop.new.run }
sleep 1
t.terminate

我不明白:

代码语言:javascript
运行
复制
exiting

有人能给我指出正确的方向吗?我希望在终止线程时有相同的行为。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-13 08:13:11

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

代码语言:javascript
运行
复制
at_exit { puts 'exiting' }
票数 5
EN

Stack Overflow用户

发布于 2012-12-13 08:53:51

trap('SIGTERM')将只对从OS平台发送的信号作出响应。

Thread#terminate是会杀死线程的ruby代码。

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

票数 3
EN

Stack Overflow用户

发布于 2013-08-04 19:14:03

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13850554

复制
相关文章

相似问题

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