Was macht active_record mit den Signalprozessen unter Windows (ich sehe das nicht mit den gleichen Versionen auf dem Mac), dass es sich so seltsam verhält? Zum Beispiel:Ruby, windows, active_record und Control-C
require 'rubygems'
trap("INT"){puts "interrupted"}
puts __LINE__
sleep 5
require 'active_record'
trap("INT"){puts "interrupted again"}
puts __LINE__
sleep 5
Wenn ich den obigen Code ausführen (Rubin 1.8.6, gem 1.3.1, 2.2.2 Active,) schlage ich kann^C so oft, wie ich im ersten Schlaf gefallen, aber Der erste Interrupt nach der Anforderung von activerecord bewirkt, dass das Skript beendet wird. Im obigen Fall wird der Trap weiterhin ausgeführt, das Programm kann jedoch nicht fortgesetzt werden. Gewöhnlich.
Das Entfernen des zweiten Aufrufs zum Trap hat keine Auswirkung auf das Verhalten.
Der eigentliche Ärger ist, dass unter bestimmten Bedingungen die Falle überhaupt nicht ausgeführt wird. Wenn man bedenkt, dass der Sinn darin liegt, meinen Code nach sich selbst aufzuräumen (entferne seinen Footprint in der Datenbank, so dass der nächste Typ einen gesunden Zustand sieht), ist das ein echtes Problem. Zum Beispiel:
require 'rubygems'
require 'active_record'
trap("INT"){puts "interrupted"}
puts __LINE__
gets
Drücken von^C nach dem Puts sehen wird die Falle überhaupt nicht ausführen.
Ich sehe dieses Problem nur nach der Anforderung active_record. Gibt es eine Problemumgehung? Ich wäre neugierig zu wissen, ob das ein Fehler ist oder ob es irgendeine Erklärung gibt. Wie gesagt, ich habe kein Problem damit auf dem Mac - wiederholte Cs führen zu mehreren Ausführungen des Trap-Prozesses.
dank ...
Hey Es ist Ruby unter Windows. Sei einfach glücklich, dass es deine Maschine nicht in Brand setzt (ich denke, dass sie diesen Fehler in 1.4 behoben haben). – Pesto
Nur neugierig, aber warum ist es notwendig, irgendein SIGINT zu fangen, anstatt Rubys Unterbrechungsausnahme innerhalb eines Teils Ihres Codes zu retten? Vielleicht würde es ausreichen, Ihre Lösung auf den langwierigen Prozess zu beschränken, anstatt * irgendeinen * SIGINT * irgendwo in Ihrem Code * einzufangen. –
Wenn Sie die Aufrufe von Traps weiter testen möchten, können Sie 'Process.kill" INT ", $$' wie in http://www.ntecs.de/old-hp/sdirektnet/ruby/uguide18.html aufrufen. Auch der Rückgabewert von Trap ist der vorherige Proc, den er ausgeführt hätte, so dass Sie überprüfen können, ob der aktive Datensatz das ändert. Es scheint nicht so auf meinem Mac zu sein. –