Underc0de

Programación Scripting => Ruby => Mensaje iniciado por: Dharok en Febrero 23, 2010, 11:23:02 PM

Título: Procesos en Ruby
Publicado por: Dharok en Febrero 23, 2010, 11:23:02 PM
Hemos visto ya como crear hilos de nuestros propios procesos en Ruby. Sin embargo, ?C?mo har?amos para crear un proceso ajeno a nuestro script? Ruby implementa una serie de clases y m?todos que pueden ser utilizados para gestionar dichos procesos. Veamos pues como hacer esto:

CREAR PROCESOS:

En Ruby para invocar un proceso, podemos utilizar system. System, lo que har?a ser?a llamar a la consola del sistema operativo en el que te encuentres y ejecutar los comandos que t? le quieras pasar. Si el comando se ha encontrado y ha sido ejecutado se mostrar? true, en caso contrario, false. Para probar esto, abrid el interprete interactivo de Ruby poniendo "irb" en vuestra consola de comandos y jugad:
irb(main):001:0> system('ls') #pasamos el comando ls para ver los directorios y archivos del directorio en el que nos encontramos.
Biblioteca         Programaci?n          Universidad
hilos.rb         Ruby             vN0tdoser.rb
md5.pl            ruby-pcap-0.6.tar.gz     Windows_uE_SP3_2008.1_Bj-Guanaco
nautilus-computer.desktop  rubyscript2exe-0.5.3.rb
pcap            so.rb
=> true #Nos devuelve "true".
irb(main):002:0> system('cd "Universidad"')
=> true
irb(main):003:0> system('ruby hilos.rb') # Nos ejecuta el c?digo en Ruby.
21 abierto en www.code-makers.es
21 abierto en www.google.com
21 abierto en www.youtube.com
80 abierto en www.code-makers.es
80 abierto en www.google.com
80 abierto en www.youtube.com
81 abierto en www.code-makers.es
81 abierto en www.google.com
81 abierto en www.youtube.com
=> true
irb(main):004:0> system('pedrolo') # Intentamos pasar el m?todo "pedrolo".
=> false #Nos devuelva false, ya que no existe dicho m?todo.


JUGAR CON LOS PROCESOS:

Esto est? bien para casos sencillos, en los que no se requiera mucha interacci?n con el proceso. Cabe decir adem?s que el inconveniente de usar system, es que la salida de tu comando va al mismo lugar que la salida de tu programa (es decir, que al poner por ejemplo: system('ls'), lo que vamos a obtener va a ser "true" y no el conjunto de archivos y carpetas existentes en el directorio. Adem?s, muchas veces necesitamos tener m?s control sobre estos procesos y obtener y enviar datos con el proceso, es decir, que haya un intercambio. Para esto tenemos el m?todo IO.popen. El m?todo IO.popen ejecuta un comando como un subproceso y conecta las salida y entrada est?ndar al objeto Ruby IO. Si quisiesemos leer la salida del programa podr?amos hacerlo mediante la lectura del objeto IO. Vamos a ver un ejemplo, para ello, os animo a que ejecut?is vuestra consola interactiva por medio del comando "irb":
irb(main):001:0> a=IO.popen('ls')
=> #<IO:0xb7c22c2c>
irb(main):002:0> a=a.read
=> "a.sh\nBiblioteca\nfirefox-3.0.3.tar.bz2\nhilos.rb\nmariposa.jpg\nmd5.pl\nMetamorfosis.odt\nMetamorfosis.rb\nnautilus-computer.desktop\nPantallazo.png\npcap\nPreMetamorfosis.odp\nprocesos.txt\nProgramaci\303\263n\nrana.jpg\nRespuestas.txt\nRuby\nruby-pcap-0.6.tar.gz\nrubyscript2exe-0.5.3.rb\nsniffer.rb\nSoluciones.rb\nso.rb\nUniversidad\nvN0tdoser.rb\nWindows_uE_SP3_2008.1_Bj-Guanaco\n"
irb(main):003:0> a=a.gsub("\n","   ")
=> "a.sh   Biblioteca   firefox-3.0.3.tar.bz2   hilos.rb   mariposa.jpg   md5.pl   Metamorfosis.odt   Metamorfosis.rb   nautilus-computer.desktop   Pantallazo.png   pcap   PreMetamorfosis.odp   procesos.txt   Programaci\303\263n   rana.jpg   Respuestas.txt   Ruby   ruby-pcap-0.6.tar.gz   rubyscript2exe-0.5.3.rb   sniffer.rb   Soluciones.rb   so.rb   Universidad   vN0tdoser.rb   Windows_uE_SP3_2008.1_Bj-Guanaco   "

sto muestra la simplicidad con la que podemos manejar procesos en Ruby a trav?s de tuber?as. Primero se abre la tuber?a, se escribe una orden y se lee la respuesta.

M?s documentaci?n sobre la clase IO:

Clase IO (http://www.ruby-doc.org/core/classes/IO.html#M002267)

AUTOR: sh4van3