2011-01-01 11 views
6

Sto implementando un sistema di verifica in Ruby. Esegue file eseguibili con diversi test. Se la soluzione non è corretta, può volerci un'eternità perché finisca con determinati test. Ecco perché voglio limitare il tempo di esecuzione a 5 secondi.Come uscire da un processo eseguito con Ruby se impiega più di 5 secondi?

sto usando la funzione() per eseguire i file eseguibili di sistema:

system("./solution"); 

.NET ha un grande WaitForExit() metodo, che dire di Ruby ?.

C'è un modo per limitare il tempo di esecuzione del processo esterno a 5 secondi?

Grazie

risposta

11

È possibile utilizzare la libreria standard di timeout, in questo modo:

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

In questo modo non dovrete preoccuparvi di errori di sincronizzazione.

+0

Grazie, funziona benissimo – Alex

+0

Ho scelto questo come risposta accettata, perché a differenza della soluzione di EnabrenTane, ogni test non richiede 5 secondi minimo per essere completato. Uso il sistema ("sudo killall solution") per terminare il processo in esecuzione. – Alex

4

Fork tuo figlio che esegue "./solution", il sonno, controllare se il suo fare, se non ucciderlo. Questo dovrebbe farti cominciare.

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

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

+0

Grazie per il collegamento. Vedo che posso usare il metodo della forcella. Ma come posso collegarlo con il sistema ("./ solution")? – Alex

+1

@Alex, aggiornato, dovrebbe essere più utile. – EnabrenTane

+0

Grazie mille! Questo è esattamente ciò di cui ho bisogno. C'è solo un problema. Ora tutti i test durano 5 secondi. Tuttavia la maggior parte dei test sono passati in meno di un secondo. C'è un modo per risolverlo? – Alex