Repository 32bit  Forum
Repository 64bit  Wiki

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.

Recuperare output programma esterno

Messaggioda wakkokid » mar giu 03, 2008 14:40

Salve,
Ricollegandomi alla discussione riguardo a come lanciare un'applicazione di terzi da un programma c++
(http://www.slacky.eu/forum/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
wakkokid
Linux 2.4
Linux 2.4
 
Messaggi: 339
Iscritto il: gio gen 27, 2005 0:00
Kernel: 2.6.3*
Desktop: Kde4
Distribuzione: Debian

Re: Recuperare output programma esterno

Messaggioda robbybby » mar giu 03, 2008 20:27

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
robbybby
Linux 3.x
Linux 3.x
 
Messaggi: 1183
Iscritto il: sab dic 16, 2006 10:48
Località: Fra Trantor e Terminus
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5

Re: Recuperare output programma esterno

Messaggioda wakkokid » mar giu 03, 2008 20:54

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
wakkokid
Linux 2.4
Linux 2.4
 
Messaggi: 339
Iscritto il: gio gen 27, 2005 0:00
Kernel: 2.6.3*
Desktop: Kde4
Distribuzione: Debian

Re: Recuperare output programma esterno

Messaggioda alessiodf » mar giu 03, 2008 20:59

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
alessiodf
Linux 2.6
Linux 2.6
 
Messaggi: 823
Iscritto il: ven ott 14, 2005 20:04
Località: Roma
Slackware: current
Kernel: 2.6.26.4
Desktop: Kde 4.1

Re: Recuperare output programma esterno

Messaggioda robbybby » mar giu 03, 2008 21:06

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
robbybby
Linux 3.x
Linux 3.x
 
Messaggi: 1183
Iscritto il: sab dic 16, 2006 10:48
Località: Fra Trantor e Terminus
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5

Re: Recuperare output programma esterno

Messaggioda wakkokid » mar giu 03, 2008 22:44

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: )
Avatar utente
wakkokid
Linux 2.4
Linux 2.4
 
Messaggi: 339
Iscritto il: gio gen 27, 2005 0:00
Kernel: 2.6.3*
Desktop: Kde4
Distribuzione: Debian


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti