Как использовать блокировку сигналов в Ruby

Как в Ruby блокировать определенные сигналы? (То есть sigprocmask, как описано здесь: http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_21.html#SEC371 )

Вот мой пример кода

pid = fork do
  trap('INT') do
    puts "Graceful shutdown..."
    puts "goodbye"
    exit 0
  end

  loop do
    this_could_be_interrupted
    something_that_must_not_be_interrupted
    this_could_be_interrupted_too
  end
end

sleep 5
Process.kill('INT', pid)

Могу ли я обернуть something_that_must_not_be_interrupted в рубиновый блок или что-то еще, чтобы гарантировать, что SIGINT не будет обрабатываться, пока этот метод работает?

Думаю, идеальным было бы, если бы я мог сделать что-то вроде этого :

Process.block_signal('INT') do
  something_that_must_not_be_interrupted
end

ОБНОВЛЕНИЕ : Сейчас я делаю что-то вроде этого:

trap('INT') do
  @interrupted = true
end

loop do
  exit 0 if @interrupted
  something_that_must_not_be_interrupted
end

13
задан phylae 17 June 2011 в 20:29
поделиться