2011-01-01 7 views
6

Ich implementiere ein Prüfsystem in Ruby. Es führt ausführbare Dateien mit verschiedenen Tests aus. Wenn die Lösung nicht korrekt ist, kann es dauern, bis sie mit bestimmten harten Tests beendet ist. Deshalb möchte ich die Ausführungszeit auf 5 Sekunden beschränken.Wie beende ich einen Prozess, der mit Ruby ausgeführt wird, wenn es mehr als 5 Sekunden dauert?

Ich bin mit system() Funktion Executables auszuführen:

system("./solution"); 

.NET eine große WaitForExit() Methode hat, was zu Ruby ?.

Gibt es eine Möglichkeit, die Ausführungszeit eines externen Prozesses auf 5 Sekunden zu begrenzen?

Dank

Antwort

11

können Sie die Standard-Timeout-Bibliothek verwenden, etwa so:

require 'timeout' 
Timeout::timeout(5) { system("./solution") } 

Auf diese Weise werden Sie nicht über Synchronisationsfehler kümmern.

+0

Danke, funktioniert super – Alex

+0

Ich wählte dies als akzeptierte Antwort, denn im Gegensatz zu EnabrenTane-Lösung, dauert jeder Test nicht mindestens 5 Sekunden zu vervollständigen. Ich benutze System ("sudo killall solution"), um den laufenden Prozess zu beenden. – Alex

4

Fork Ihr Kind die „./solution“, Schlaf führt, überprüfen, ob ihre getan, wenn sie nicht töten. Dies sollte Ihnen den Einstieg erleichtern.

pid = Process.fork{ system("./solution")} 
sleep(5) 
Process.kill("HUP", pid) 

http://www.ruby-doc.org/core/classes/Process.html#M003153

+0

Danke für den Link. Ich sehe, ich kann die Fork-Methode verwenden. Aber wie kann ich es mit System verbinden ("./ Lösung")? – Alex

+1

@Alex, aktualisiert, sollte hilfreicher sein. – EnabrenTane

+0

Vielen Dank! Genau das brauche ich. Es gibt nur ein Problem. Jetzt dauern alle Tests 5 Sekunden. Die meisten Tests werden jedoch in weniger als einer Sekunde durchgeführt. Gibt es eine Möglichkeit, das zu beheben? – Alex