• Domingo 15 de Diciembre de 2024, 15:30

Autor Tema:  Capturar Salida  (Leído 2346 veces)

emuller

  • Miembro MUY activo
  • ***
  • Mensajes: 104
    • Ver Perfil
Capturar Salida
« en: Viernes 21 de Diciembre de 2007, 17:40 »
0
Hola a todos. Quiero saber como hacer para que un programa ejecute a otro y el primero capture la salida (stdout y stderr) del que ejecutó. Por ejemplo, para hacer un frontend de una aplicación de línea de comando (como un compresor de archivos, etc).
Quiero probar un par de cosas en C++ y eso es algo que quiero aprender a hacer, principalmente cuando se trata de programar dentro del mundo UNIX (Linux, etc).
Mi deseo: que le otorguen el premio Nobel de la paz al inventor del Copy & Paste. Gracias por evitarme tantas peleas con el tiempo y aumentar la esperanza de vida de mi teclado \":)\"

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Capturar Salida
« Respuesta #1 en: Sábado 22 de Diciembre de 2007, 02:04 »
0
Usando pipes ( popen ) forks() y exec().
Cita de: "comp.lang.c"
19.30:   How can I invoke another program or command and trap its output?

A:   Unix and some other systems provide a popen() function, which
   sets up a stdio stream on a pipe connected to the process
   running a command, so that the output can be read (or the input
   supplied).  (Also, remember to call pclose().)

   If you can't use popen(), you may be able to use system(), with
   the output going to a file which you then open and read.

   If you're using Unix and popen() isn't sufficient, you can learn
   about pipe(), dup(), fork(), and exec().

   (One thing that probably would *not* work, by the way, would be
   to use freopen().)

   References: PCS Sec. 11 p. 169.
Esto te debe de servir.
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

emuller

  • Miembro MUY activo
  • ***
  • Mensajes: 104
    • Ver Perfil
Re: Capturar Salida
« Respuesta #2 en: Sábado 22 de Diciembre de 2007, 21:16 »
0
Gracias, el enlace está muy interesante. Lo que no sé (tengo que averiguar), es si las funciones popen, etc están disponibles en Windows con el compilador MinGW, ya que quiero hacer algunas cosas multiplataforma (estoy pensando en probar Ultimate++, o alguna otra cosa como Qt o Gtk). Si no funciona lo de los pipes en Windows supongo que tendré que utilizar lo de system y usar un archivo, lo que me lleva a otra pregunta ¿cómo hago para redirigir stdout y stderr a archivos, teniendo que hacerlo desde mi propio programa y redirigir las salidas del programa al que llamé?
Mi deseo: que le otorguen el premio Nobel de la paz al inventor del Copy & Paste. Gracias por evitarme tantas peleas con el tiempo y aumentar la esperanza de vida de mi teclado \":)\"

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Capturar Salida
« Respuesta #3 en: Sábado 22 de Diciembre de 2007, 23:14 »
0
No podes redirigir el stdout y stderr por separado, solo lo podes usar en conunto.
Para Unix... ejecuta "programa 2>&1" y asi tendras stderr y stdout unificados.

Si no esncuentras nada para Windows te recomiendo Perl 5.10  :rolleyes:

PD: encontre algo de interes... como hacer un popen en Windows
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Capturar Salida
« Respuesta #4 en: Domingo 23 de Diciembre de 2007, 00:53 »
0
El ejemplo usando la API de Windows de la MSDN:
Creating a Child Process with Redirected Input and Output.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

emuller

  • Miembro MUY activo
  • ***
  • Mensajes: 104
    • Ver Perfil
Re: Capturar Salida
« Respuesta #5 en: Domingo 23 de Diciembre de 2007, 02:51 »
0
Pues entonces parece que no hay una manera única de hacerlo con las librerías estándar (repito que tengo pensado, al menos por ahora, utilizar MinGW en Windows). La información que me han dado seguro me servirá, gracias.
Mi deseo: que le otorguen el premio Nobel de la paz al inventor del Copy & Paste. Gracias por evitarme tantas peleas con el tiempo y aumentar la esperanza de vida de mi teclado \":)\"

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Capturar Salida
« Respuesta #6 en: Domingo 23 de Diciembre de 2007, 10:21 »
0
No es la mejor solucion pero para hacerlo casi portable, solo cambias minimamente la linea de comandos segun creo recordar, podes usar redirigir la salida con system + un pipe tambien en Windows:

Código: Text
  1.  
  2. system("dir > resultado.txt");
  3.  
  4.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

emuller

  • Miembro MUY activo
  • ***
  • Mensajes: 104
    • Ver Perfil
Re: Capturar Salida
« Respuesta #7 en: Martes 1 de Enero de 2008, 06:07 »
0
Gracias por el dato. Lo probaré. De todas maneras, supongo que la manera más profesional (por decirlo de alguna manera) es construir la mejor solución para cada plataforma y luego hacer que compile uno u otro (con el make o algo de eso, pero eso es otra cosa que tengo que aprender). feliz año nuevo para todos!!  :hola:
Mi deseo: que le otorguen el premio Nobel de la paz al inventor del Copy & Paste. Gracias por evitarme tantas peleas con el tiempo y aumentar la esperanza de vida de mi teclado \":)\"

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Capturar Salida
« Respuesta #8 en: Martes 1 de Enero de 2008, 16:49 »
0
Si, podes usar compilacion condicional  B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

emuller

  • Miembro MUY activo
  • ***
  • Mensajes: 104
    • Ver Perfil
Re: Capturar Salida
« Respuesta #9 en: Lunes 4 de Febrero de 2008, 15:03 »
0
Bueno, tras una breve pausa por vacaciones vuelvo a entrar en el foro. He averiguado y visto un poco más y encontré que en el caso de Qt proveé una clase (Qprocess) para lanzar aplicaciones y permite manejar la salida y entrada estándar. También he visto que MinGW tiene la función popen pero no se que tal andará ni tampoco si otro compiladores (como MS VC++) la tendrán implementada (no se si forma parte de la librería estándar). Seguiré averiguando y cualquier cosa nueva que encuentre la publico.
Mi deseo: que le otorguen el premio Nobel de la paz al inventor del Copy & Paste. Gracias por evitarme tantas peleas con el tiempo y aumentar la esperanza de vida de mi teclado \":)\"