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 で) 送信していない場合、トラップ ブロックは実行されません。Kernel メソッドも参照してください。

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

trap('SIGTERM')OS ランドから送信されたシグナルにのみ応答します。

Thread#terminateスレッドを強制終了する Ruby コードです。

スレッドが強制終了される前に実行する動作を指定する方法がわかりません。それは興味深いかもしれません。しかし、のセマンティクスでは実際には許可されないため、存在するとは思いませんThread#kill/terminate/join

于 2012-12-13T00:53:51.367 に答える
0

試してみてくださいtrap("EXIT")。SIGTERM は、ctrl-C または kill コマンドによって送信されます。ルビードキュメントから:

特別なシグナル名「EXIT」またはシグナル番号 0 は、プログラム終了の直前に呼び出されます。

于 2013-08-04T11:14:03.420 に答える