Newsgroup: it.comp.lang.c++
Titolo: esecuzione comando con POPEN e cattura della pipa

ciao a tutti,
ho qualche problema a leggere la pipa dopo popen.
il mio spezzone di codice c++ è:
FILE *fp;
fp = popen("COMANDO","r");
fgets(out,sizeof out,fp);
pclose(fp);
penso che il tutto sia molto standard.
bene... questo codice è inserito in 1 funzione che richiamo + volte
dal mio main. alla prima iterazione funziona, alla seconda il
programma si blocca dando Segmentation Fault durante "fgets".
(supera la riga "fp = popen"  e non arriva a "pclose", quindi credo
che il problema sia "fgets")
dimentico forse di fare qualche operazione fondamentale?
è magari 1 problema del mio sistema (RedHat7.1 con gcc3.0)?
grazie mille
 Marco

me funziona
sulla carta anche il mio dovrebbe funzionare!!!
ho provato a debuggare e mi pare di notare un errore in pclose()
durante la prima iterazione, ed un sacco di errori in fgets() durante
la seconda iterazione.
qualcosa di bacato????
grazie mille
 Marco

Ciao Marco,
se mi facessi un esempio concreto e completo sarebbe meglio ripeto.
Potrebbe dipendere dal tuo "COMANDO", che magari ha qualche errore.
Controlla quindi anche se _popen() ti ritorna NULL il che vorrebbe
significare che c´e´ stato un errore all´apertura della pipe.
Ovviamente di conseguenza poi ti dara´ errori sia nella fgets() sia nella
_pclose().
Maurus che aspetta il tuo esempio.

>Maurus che aspetta il tuo esempio.
a dire il vero il mio esempio è addirittura + semplice del tuo!!!!!
io lavoro sotto Linux! il valore ritornato è quello giusto!!!!
cmq ecco la mia routine:
        std::string Snmp::get (std::string oid) {
                cout << endl << "starting Snmp::get()" << endl;
                std::string tmp = "snmpget -Oqv localhost ";
                tmp += oid;
                FILE *fp = 0;
                cout << "now starting command : " << tmp <<endl;
                fp = popen(tmp.c_str(),"r");
                cout << "finished command: " << tmp << endl;
                char *out;
                cout << "OUT created: " << endl;
                fgets(out,sizeof out,fp);
                cout << "got OUT" << endl;
                int i = pclose(fp);
                cout << "PIPE closed" <<endl;
                string outs = out;
                cout << "Snmpget: valore recuperato = " << out <<
endl;
                cout << "Snmpget: valore recuperato = " << outs <<
endl;
                cout << "ending Snmp::get()" << endl;
                return outs;
        }
dopo l'ultimo MAKE e l'ultimo DEBUGGING l'errore si è spostato
addirittura in fase di passaggio del valore di ritorno al main!
forse problema con la gestione delle stringhe?
grazie
 Marco

                 int i = pclose(fp);
E out dove l'allochi? Come fai a sapere di aver gia' letto tutto
l'output del tuo comando?
Ciao,
Nicola

 Marco
No, quando vedi questi strani comportamenti, di problemi che si spostano
come impazziti da una parte all´altra del codice, spesso il problema sta in
puntatori che non si sa dove puntino e in memoria che viene sporcata.
Alla prossima
Maurus
contento che Marco gli ha finalmente postato il codice :-)

contento che Marco gli ha finalmente postato il codice :-)
hai troppo ragione!!!!
stavo già imprecando contro le librerie di non so che cosa...mi sono
pure aggiornato il GCC alla 3.0 pensando ad un baco della 2.96.
chiedo venia per il disturbo e ringrazio infinitamente!
Marco