Что такое active_record, выполняющее сигнальные процессы под окнами (я не вижу этого с теми же версиями на Mac), что заставляет его вести себя так странно? Например:Ruby, windows, active_record и Control-C
require 'rubygems'
trap("INT"){puts "interrupted"}
puts __LINE__
sleep 5
require 'active_record'
trap("INT"){puts "interrupted again"}
puts __LINE__
sleep 5
Когда я запускаю приведенный выше код (рубин 1.8.6, камень 1.3.1, 2.2.2 ActiveRecord), я могу нажать^C, как много раз, как я люблю во время первого сна, но первое прерывание после требования activerecord приводит к завершению работы скрипта. В приведенном выше случае ловушка все еще выполняется, она не позволяет программе продолжать работу. Как правило.
Удаление второго вызова ловушки не влияет на поведение.
Настоящая досада заключается в том, что в некоторых условиях ловушка не выполняется вообще. Учитывая, что все это делается для того, чтобы очистить мой код после себя (удалить его след в базе данных, чтобы следующий парень увидел нормальное состояние), это настоящая проблема. Например:
require 'rubygems'
require 'active_record'
trap("INT"){puts "interrupted"}
puts __LINE__
gets
Нажатие кнопки^C после того, как пушки не будут запускать ловушку.
Я вижу эту проблему только после того, как требуется active_record. Есть ли обходной путь? Мне было бы интересно узнать, является ли это ошибкой или есть какие-то объяснения. Как я уже сказал, у меня нет проблем с этим на mac - повторение^Cs приводит к нескольким запускам ловушки proc.
благодаря ...
Эй , это Ruby на Windows. Просто будьте счастливы, если он не включит вашу машину (я думаю, что они исправили эту ошибку в 1.4). – Pesto
Просто любопытно, но зачем нужно перехватывать любой SIGINT, а не спасать исключение исключения Ruby в некоторой части вашего кода? Возможно, сужение вашего решения до продолжительного процесса было бы достаточно, а не ловли * любой * SIGINT * в любом месте вашего кода *. –
Если вы хотите дополнительно протестировать вызовы ловушки, вы можете вызвать 'Process.kill 'INT', $$' как в http://www.ntecs.de/old-hp/s-direktnet/ruby/uguide18.html. Кроме того, возвращаемое значение ловушки - это предыдущий Proc, который он выполнил бы, поэтому вы можете проверить, изменила ли активная запись это. Кажется, это не так на моем mac. –