[?] Volcado del output al usar system en una variable

Iniciado por ElTioBatiste, 8 Junio 2017, 23:01 PM

0 Miembros y 1 Visitante están viendo este tema.

ElTioBatiste

Buenos dias! Estoy actualmente programando en C/C++ y resulta que tengo que llamar a un programa para generar unos ficheros. Para hacer esto, utilizo la funcion system lo cual viene de perlas porque así el codigo no continua hasta que el programa "llamado" ha acabado. Ahora bien, el programa al que llamo, tarda bastante en ejecutarse (+de 15 min). Por lo tanto es necesario dar unas especie de "feedback" al usuario. El programa que se ejecuta normalmente, da outputs a la consolo la funcion "system" no crea una consola estos se pierden. Hasta ahora las diferentes alternativas que veo serian:
    - 1a Opcion: Volcar los outputs en un .txt (mediante el >) y en el "system" poner un & para que la aplicacion pueda continuar (sé que esto funciona en linux pero alguien me podria confirmar si funciona en windows tambien?). Contando que el anderson funcione con windows, el problema seria como hacer el "while" que va haciendo el output para que no pare hasta que se acabe el proceso, sin contar que no me parece muy sano abrir y leer un archivo que esta en proceso de ser modificado.
    - 2a Opcion: Conseguir, de alguna forma, que los outputs vayan a un buffer/char y poderlos sacar a pantalla con el fprint. Aunque desconozco si esto es posible y como se haria el loop que detecta si el programa ha hecho un nuevo output y lo saca por pantalla hasta que el programa deje de ejecutarse.
     - 3a Opcion: La cual me parece la mas sana y la menos alocada, conseguir crear una terminal para este programa (si puede ser aunque el programa se ejecute en windows o en linux) y que así mostrase los outputs del proceso y se cerrase al acabar el programa.
Muchas gracias por haber dedicado su tiempo a leer el post y agradeceria sinceramente toda la ayuda que me pudiesen dar!
Pasen un dia magnífico!

MAFUS

#1
Una respuesta esta aquí: https://stackoverflow.com/questions/7292642/grabbing-output-from-exec

Adaptando el código:
Supongamos un programa llamado 'd', que será el llamado que está en el mismo directorio que el programa principal 'c', quien recibe la salida del primero.

d
#include <stdio.h>
#include <limits.h>

int main() {
for(unsigned i = 0; i < UINT_MAX; ++i)
printf("%u\n", i);
}


c
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
   int link[2];
   pid_t pid;
   char salida[4096];
   
   pipe(link);
   pid = fork();
   
   if(pid) {
       int status;
       int nbytes;
       
       close(link[1]);
       printf("Salida del hijo:\n");
       
       do {
           nbytes = read(link[0], salida, sizeof(salida));
           printf("%.*s", nbytes, salida);
           waitpid(-1, &status, WNOHANG);
       } while(WIFEXITED(status));
       printf("Fin del hijo\n");
   }
   else {
       dup2 (link[1], STDOUT_FILENO);
       close(link[0]);
       close(link[1]);
       execl("./d", "d", (char*)NULL);
   }
}


ElTioBatiste

Muchas gracias por tu respuesta! Realmente detallada y de gran ayuda! De momento, estoy tratando de corregir algunos errores que me han aparecido o de encontrar al menos el origen de estos!