2010-01-29 4 views
8

Quiero ejecutar un script seguro para subprocesos en Ruby que llame a un programa externo, luego comprueba el estado de salida de ese programa externo. ¿Cuál es la mejor manera de hacerlo? Hasta ahora, he estado revisando $?, pero creo que estoy obteniendo una condición de carrera con otras partes del programa.Proceso externo a prueba de roscas en ruby, más comprobación de exitstatus

Aquí hay un código de ejemplo:

Thread.new do 
    `external_program` 
    if $?.exitstatus == 0 
    # it worked. 
    else 
    # it didn't work. 
    end 
end 

Idealmente, me gustaría hacer algo como

Process.new(`external_program`).exitstatus 

para que el exitstatus estuvo inextricablemente unido a que proceso, más que el último que sucedió para completar. ¿Hay alguna manera de hacer esto?

+0

¿El script es de código abierto o es privado? –

+0

@Andrew: código abierto (es mi script). – Peter

Respuesta

15

Aunque rb_last_status (aka $?) es una variable global, Ruby hace un truco de magia para hacer que cada subproceso: En rb_thread_save_context, almacena rb_last_status en la estructura del hilo de edad; rb_thread_restore_context establece rb_last_status desde el valor guardado. Si tienes una condición de carrera que implica $?, es un error de Ruby.

+1

@Wayne - esta es la razón por la que vengo a stackoverflow; gente como tú que conoce la información de fondo. ¡¡Gracias!! – Peter

+0

@Peter, de nada. No sabía esto hasta que me lo preguntaste y me diste una razón para profundizar en la fuente. Me gusta cavar –

Cuestiones relacionadas