2012-04-18 14 views
8

Estoy aprendiendo a través de la programación de sistemas de rubí y estoy teniendo problemas para entender este comportamiento:necesita ayuda para entender Process.detach de rubí

pid = fork do 
    Signal.trap("USR1") do 
    puts "hello!" 
    end 
    Signal.trap("TERM") do 
    puts "Terminating" 
    exit 
    end 
    loop do 
    end 
end 

Process.detach(pid) 

Process.kill("USR1", pid) 
Process.kill("USR1", pid) 
Process.kill("USR1", pid) 
Process.kill("USR1", pid) 

Process.kill("TERM", pid) 

Este salidas como espero:

hello! 
hello! 
hello! 
hello! 
Terminating 

Sin embargo, si Comente Process.detach, el proceso hijo parece responder solo a la señal una vez (y después de la terminación?):

Terminating 
hello! 

No entiendo por qué sucede esto cuando no desconecto el proceso, aunque lo envié cuatro veces. ¿Alguien puede ayudar a explicar este comportamiento? Creo que no entiendo qué significa separar un proceso.

¡Muchas gracias!

Respuesta

7

Todo depende de la temporización, sospecho, es decir, la diferencia se debe a la forma en que las instrucciones de su proceso principal y el proceso bifurcado están programadas para ejecutarse una con relación a la otra.

Al realizar Process.detach, se crea un nuevo subproceso que espera el resultado de salida del proceso especificado. Puede reemplazar Process.detach con

Thread.new { Process.wait(pid) } 

y obtener el mismo efecto. Sospecho que llamar a detach (y generar un nuevo hilo) le da al proceso bifurcado, como efecto secundario, la posibilidad de ser programado.

Si no tiene separación, entonces supongo que su proceso de bifurcación no se ejecutará en el momento en que le diga que muera.

Puede ver lo que quiero decir por tiempo relativo insertando algunas llamadas de espera en su código para ver si puede obtener el mismo comportamiento observado sin desconectar.

Por ejemplo, esto parece funcionar para mí, aunque su experiencia puede variar dependiendo de la plataforma de acogida:

pid = fork do 
    Signal.trap("USR1") do 
    puts "hello!" 
    end 
    Signal.trap("TERM") do 
    puts "Terminating" 
    exit 
    end 
    loop do 
    end 
end 

sleep(1) 

Process.kill("USR1", pid) 
Process.kill("USR1", pid) 
Process.kill("USR1", pid) 
Process.kill("USR1", pid) 

sleep(1) 

Process.kill("TERM", pid) 

Esto produce:

hello! 
hello! 
hello! 
hello! 
Terminating 
+0

ah, gracias! Sí, supongo que la programación es lo que me resulta desconcertante (estoy en OSX, debería probarlo en una caja virtual y ver qué pasa). – ambertch

Cuestiones relacionadas