线程#终止并处理SIGTERM

mpo*_*z08 2 ruby multithreading signals

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

class InfiniteLoop
  def run
    trap('SIGTERM') do
      puts 'exiting'
      exit
    end
    loop {}
  end
end
Run Code Online (Sandbox Code Playgroud)

如果我跑:

InfiniteLoop.new.run
Run Code Online (Sandbox Code Playgroud)

我可以ctrl+c得到:

exiting
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时:

t = Thread.new { InfiniteLoop.new.run }
sleep 1
t.terminate
Run Code Online (Sandbox Code Playgroud)

我没有看到:

exiting
Run Code Online (Sandbox Code Playgroud)

有人能指出我在正确的方向吗?我想在终止线程时有相同的行为.

小智 5

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

at_exit { puts 'exiting' }
Run Code Online (Sandbox Code Playgroud)