SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: emuller en Viernes 21 de Diciembre de 2007, 17:40

Título: Capturar Salida
Publicado por: emuller en Viernes 21 de Diciembre de 2007, 17:40
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).
Título: Re: Capturar Salida
Publicado por: su - en Sábado 22 de Diciembre de 2007, 02:04
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. (http://www.iu.hio.no/~mark/unix/unix.html#SEC177)
Título: Re: Capturar Salida
Publicado por: emuller en Sábado 22 de Diciembre de 2007, 21:16
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é?
Título: Re: Capturar Salida
Publicado por: su - en Sábado 22 de Diciembre de 2007, 23:14
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 (http://lists.trolltech.com/qt-interest/1999-09/thread00282-0.html)
Título: Re: Capturar Salida
Publicado por: Eternal Idol en Domingo 23 de Diciembre de 2007, 00:53
El ejemplo usando la API de Windows de la MSDN:
Creating a Child Process with Redirected Input and Output (http://msdn2.microsoft.com/en-us/library/ms682499(VS.85).aspx).
Título: Re: Capturar Salida
Publicado por: emuller en Domingo 23 de Diciembre de 2007, 02:51
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.
Título: Re: Capturar Salida
Publicado por: Eternal Idol en Domingo 23 de Diciembre de 2007, 10:21
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.  
Título: Re: Capturar Salida
Publicado por: emuller en Martes 1 de Enero de 2008, 06:07
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:
Título: Re: Capturar Salida
Publicado por: Eternal Idol en Martes 1 de Enero de 2008, 16:49
Si, podes usar compilacion condicional  B)
Título: Re: Capturar Salida
Publicado por: emuller en Lunes 4 de Febrero de 2008, 15:03
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.