Pagina 1 di 1

Recuperare output programma esterno

Inviato: mar 3 giu 2008, 15:40
da wakkokid
Salve,
Ricollegandomi alla discussione riguardo a come lanciare un'applicazione di terzi da un programma c++
(viewtopic.php?f=20&t=24600), volevo chiedere se qualcuno sa come recuperare l'output di questo programma. Ad esempio, il programma qui sotto

Codice: Seleziona tutto

#include <iostream>
#include <string>
#include <cstdlib>
#include <unistd.h>
using namespace std;

//int System(const char *s);
int main()
{
    system("ls");
    return 0;
}
Restituisce l'elenco dei file nella directory in cui si trova, stampandolo direttamente a video. Io vorrei evitare che venga stampato a video e invece inserirlo in una stringa, su cui poi fare le dovute elaborazioni.

Vi ringrazio,
Wakko Kid

Re: Recuperare output programma esterno

Inviato: mar 3 giu 2008, 21:27
da robbybby
Un modo e' usare le pipe, e richiamare il programma esterno, con, mi pare, una spawn, con attributo P_NOWAIT.
Comunque, con la pipe, colleghi lo standard output del tuo programma all'estremita' della pipe, che poi va a leggerti con comodo, in un loop, messo magari in un thread a parte, se il tuo programma principale deve continuare a rispondere all'utente, mentre il programma che hai lanciato viene eseguito in background.
E' un argomento piuttosto complesso.
Scusa se non posso essere piu' preciso, ma l'ho usato una volta sola, qualche tempo fa.
Sell'uso delle pipe ne sono certo, della spawn invece no (la mia memoria fa un po' cilecca).

Re: Recuperare output programma esterno

Inviato: mar 3 giu 2008, 21:54
da wakkokid
Grazie, farò delle prove in questo senso, almeno so cosa cercare in google :)
per il momento redirigo l'output su un file system("ls > /tmp/log_mio_prog.txt") e poi leggo il file, anche se è assurdo e una perdita di tempo usare un accesso al disco in scrittura e uno in lettura per recuperare una stringa...

Re: Recuperare output programma esterno

Inviato: mar 3 giu 2008, 21:59
da alessiodf
eccoti un esempio che feci qualche tempo fa :D

Codice: Seleziona tutto

/* ISO headers */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

/****** DEBUG and DIE macros *******/

#ifdef DEBUG
#define LOG(...) \
                do \
{ \
                        time_t now = time(NULL); \
                        struct tm *now_s = localtime(&now); \
                        printf("LOG [%02d:%02d:%02d] ", \
                               now_s->tm_hour, now_s->tm_min, now_s->tm_sec); \
                        fflush(stdout); \
                        printf(__VA_ARGS__); \
} while(0)
#else
#define LOG(...)
#endif

/* DIE on error */
#define DIE(...) \
        do \
{ \
                time_t now = time(NULL); \
                struct tm *now_s = localtime(&now); \
                printf("ERR [%02d:%02d:%02d] ", \
                       now_s->tm_hour, now_s->tm_min, now_s->tm_sec); \
                fflush(stdout); \
                printf(__VA_ARGS__); \
                printf("\n==== MAIN CRASH ====\n"); \
                exit(EXIT_FAILURE); \
} while(0)

#define BUFF_LENGTH 128

/**
 * MAIN
 */
int main(int argc, char* argv[])
{
        FILE *program_pipe;
        char *buffer_out, *cmd_line;
        unsigned int max_output_length = 10;

        if(!(buffer_out = malloc(sizeof(char) * BUFF_LENGTH)))
        {
                DIE("malloc buffer failed\n");
        }

        if(!(cmd_line = malloc(sizeof(char) * BUFF_LENGTH)))
        {
                DIE("malloc cmd line failed\n");
        }

        snprintf(cmd_line, BUFF_LENGTH, "dmesg | tail -n %d", max_output_length);

        if(!(program_pipe = popen (cmd_line, "r")))
        {
                DIE("popen failed\n");
        }

        while(fgets(buffer_out, BUFF_LENGTH, program_pipe))
        {
                fprintf(stdout, "%s", buffer_out);

                memset(buffer_out, 0, sizeof(char) * BUFF_LENGTH);
        }

        pclose(program_pipe);

        return EXIT_SUCCESS;
}

Re: Recuperare output programma esterno

Inviato: mar 3 giu 2008, 22:06
da robbybby
wakkokid ha scritto:Grazie, farò delle prove in questo senso, almeno so cosa cercare in google :)
per il momento redirigo l'output su un file system("ls > /tmp/log_mio_prog.txt") e poi leggo il file, anche se è assurdo e una perdita di tempo usare un accesso al disco in scrittura e uno in lettura per recuperare una stringa...
Se l'output e' breve, con il caching odierno dei dischi, non e' affatto assurdo.

Re: Recuperare output programma esterno

Inviato: mar 3 giu 2008, 23:44
da wakkokid
Ringrazio tutti :D
L'esempio di Alessio è proprio quello che mi serviva, adesso lo porto in c++, con il quale ho più familiarità e mi riesce piu comodo da gestire (sono affezionato alle "string" :roll: )