Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475

    [C++ / Ubuntu] Eseguire un programma e leggerne l'output

    Ciao a tutti...

    Non è che qualcuno sa come faccio dal codice a lanciare un programma esterno e poi a leggerne l'output?

    Tipo, come faccio dal mio programma C++ a lanciare ls e quindi leggere i file nella cartella di lavoro?

    (Lo so che è una domanda da niubbo e chiedo venia ._.)
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  2. #2
    Devi usare le pipe, tipo in questo esempio:

    codice:
    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    
    int main(int argc, char ** argv) 
    {
            FILE * p = NULL;
            char buf[2056] = {0};
    
            p = popen("ls", "r");
    
            if(p)
                    std::fread(buf, 2056, 1, p);
            else
                    return -1;
    
            std::cout << buf << std::endl;
    
            pclose(p);
            return 0;
    }
    An infinite number of monkeys typing into GNU emacs would never make a good program.Linus Torvalds

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466

    Re: [C++ / Ubuntu] Eseguire un programma e leggerne l'output

    Originariamente inviato da Ippo343
    come faccio dal mio programma C++ a lanciare ls e quindi leggere i file nella cartella di lavoro?
    Puoi anche usare la famiglia di funzioni exec*.
    The exec() family of functions replaces the current process image with
    a new process image. The functions described in this manual page are
    front-ends for execve(2). (See the manual page for execve(2) for fur-
    ther details about the replacement of the current process image.)
    Usa il Linux Programmer's Manual..

  4. #4
    Tra parentesi, se l'obiettivo è ottenere nel tuo programma le informazioni che otterresti con ls, puoi usare le syscall dell'header dirent.h (man dirent.h e trovi tutto) unite alla syscall stat (man 2 stat).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Originariamente inviato da EDX
    Devi usare le pipe, tipo in questo esempio:

    codice:
    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    
    int main(int argc, char ** argv) 
    {
            FILE * p = NULL;
            char buf[2056] = {0};
    
            p = popen("ls", "r");
    
            if(p)
                    std::fread(buf, 2056, 1, p);
            else
                    return -1;
    
            std::cout << buf << std::endl;
    
            pclose(p);
            return 0;
    }
    Ciao, grazie della risposta, ma in effetti l'avevo già trovata indipendentemente prima Farò così comunque.

    @MItaly: perchè reinventare la ruota?
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  6. #6
    @Ippo343: perché avviare un processo separato, usare una pipe, parsare l'output e rischiare che il proprio programma esploda in fiamme mortali quando il comando esterno per caso fornisce output non conforme a quello che ci si aspetta, senza poi essere sicuri di come interpretare gli errori? Appoggiarsi a programmi esterni quando i dati che si cercano sono facilissimamente ottenibili tramite syscall non ha nessun senso.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Point taken ^^

    Ok, riformuliamola così: sono troppo pigro per rifarlo da capo, e qualcuno si è già preso la sbatta di farlo per me xD

    Comunque in questo caso non è un gran problema: devo prendere l'output di ls e trasmetterlo senza nessuna modifica ad un client
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  8. #8
    Gioventù pigra...
    codice:
    #include <dirent.h>
    #include <errno.h>
    #include <vector>
    #include <string>
    #include <cstring>
    #include <stdexcept>
    
    class ErrNoError : std::runtime_error
    {
    public:
        int ErrNo;
        
        ErrNoError(int _ErrNo) : ErrNo(_ErrNo), std::runtime_error(std::strerror(_ErrNo)) {}
        ErrNoError() : ErrNo(erro), std::runtime_error(std::strerror(errno)) {}
    };
    
    std::vector<std::string> GetFiles(std::string Directory)
    {
        std::vector<std::string> res;
        DIR * DirPtr=NULL;
        dirent * DirEnt=NULL;
        DirPtr=opendir(Directory.c_str());
        if(DirPtr==NULL)
            throw ErrNoError;
        try
        {
            while((DirEnt = readdir(DirPtr))!=NULL)
                res.push_back(std::string(DirEnt->d_name));
        }
        catch(...)
        {
            if(DirPtr!=NULL)
                closedir(DirPtr);
            throw;
        }
        if(closedir(DirPtr)==-1)
            throw ErrNoError;
        return res;
    }
    To', restituisce i file nella directory specificata in un vector di stringhe, solleva l'eccezione adeguata in caso di errore.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Si, ma vedi, dato che tanto io al client devo mandare sia i file che le cartelle, tanto vale che richiamo ls che fa già tutto no? ^^
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Ok, riformuliamola così: sono troppo pigro per rifarlo da capo, e qualcuno si è già preso la sbatta di farlo per me xD

    Originariamente inviato da Ippo343
    Si, ma vedi, dato che tanto io al client devo mandare sia i file che le cartelle, tanto vale che richiamo ls che fa già tutto no? ^^
    Richimare un programma esterno non va mai bene... Non è buona pratica.. E implementare una semplice funzione che svolga il compito di un basico ls senza argomenti (non introduciamo la getopt() ) non ti costa quasi niente e rendi il programma più compatto..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.