Recuperare output programma esterno

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
wakkokid
Linux 2.x
Linux 2.x
Messaggi: 339
Iscritto il: gio 27 gen 2005, 0:00
Kernel: 2.6.3*
Desktop: Kde4
Distribuzione: Debian
Contatta:

Recuperare output programma esterno

Messaggio 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

Avatar utente
robbybby
Linux 4.x
Linux 4.x
Messaggi: 1223
Iscritto il: sab 16 dic 2006, 10:48
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5
Località: Fra Trantor e Terminus

Re: Recuperare output programma esterno

Messaggio 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).

Avatar utente
wakkokid
Linux 2.x
Linux 2.x
Messaggi: 339
Iscritto il: gio 27 gen 2005, 0:00
Kernel: 2.6.3*
Desktop: Kde4
Distribuzione: Debian
Contatta:

Re: Recuperare output programma esterno

Messaggio 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...

Avatar utente
alessiodf
Linux 3.x
Linux 3.x
Messaggi: 823
Iscritto il: ven 14 ott 2005, 21:04
Slackware: current
Kernel: 2.6.26.4
Desktop: Kde 4.1
Località: Roma
Contatta:

Re: Recuperare output programma esterno

Messaggio 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;
}

Avatar utente
robbybby
Linux 4.x
Linux 4.x
Messaggi: 1223
Iscritto il: sab 16 dic 2006, 10:48
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5
Località: Fra Trantor e Terminus

Re: Recuperare output programma esterno

Messaggio 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.

Avatar utente
wakkokid
Linux 2.x
Linux 2.x
Messaggi: 339
Iscritto il: gio 27 gen 2005, 0:00
Kernel: 2.6.3*
Desktop: Kde4
Distribuzione: Debian
Contatta:

Re: Recuperare output programma esterno

Messaggio 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: )

Rispondi