2009-03-22 5 views
20

Voglio solo sapere quale è il modo migliore per eseguire un comando esterno in C++ e come posso prendere l'output se ce n'è?Come posso eseguire comandi esterni in C++/Linux?

Modifica: I Indovina che dovevo dire che sono un principiante qui in questo mondo, quindi penso che avrò bisogno di un esempio funzionante. Ad esempio, voglio eseguire un comando come:

ls -la 

come si fa?

+0

vedere il collegamento @ Mehrdad, ha un esempio con ls =) – bayda

risposta

22

Utilizzare la funzione popen.

Esempio (codice non completo della qualità della produzione, senza gestione degli errori):

FILE* file = popen("ls", "r"); 
// use fscanf to read: 
char buffer[100]; 
fscanf(file, "%100s", buffer); 
pclose(file); 
+10

@Daniel Questo non è un codice di produzione. Questa è una risposta su un forum online che dovrebbe dare un'idea di alto livello della funzione popen e dei suoi argomenti. Chiunque abbia l'abitudine di trattare tutte le risposte Stack Overflow come codice di produzione ha problemi più gravi di questo. Inoltre, qualsiasi buffer che abbia la possibilità di overflow non è un DEAD SERIOUS SECURITY MINACCE DI APPROFONDIMENTO. Senza uno specifico modello di minaccia e sapendo cosa è considerato affidabile e ciò che non è nel particolare ambiente a cui viene applicato qualcosa, la discussione sulla sicurezza è discutibile. –

+0

@Daniel Penso che il tuo primo commento dissuaderà la maggior parte delle persone. Perché non fornisci un link a una pagina CERT. Sono sicuro che questo è da qualche parte nelle [note di programmazione sicure] (https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=4063380). Mehrdad potrebbe persino aggiornare la sua risposta. –

+0

@Daniel, ti sento. Certo, un avviso di risposta più completo su tutti i possibili trucchi potrebbe essere una risposta migliore. Potresti essere in grado di scrivere un libro sui trucchi in tre righe di codice. Tuttavia, è chiaro che ciò che è pertinente a questa domanda è "popen" e non come elaboreresti ulteriormente l'output del processo esterno ... –

1

uso sistema ("ls -la") funzione

+0

Non so perché questo è stato downvoted ... –

+1

Non risponde alla domanda. Non c'è modo di ottenere l'output da una chiamata di sistema(). – greyfade

+0

funziona come un uomo .. l'ho usato più volte in devC++ IDE .... – suresh

20

Un esempio:

#include <stdio.h> 

int main() { 
    FILE * f = popen("ls -al", "r"); 
    if (f == 0) { 
     fprintf(stderr, "Could not execute\n"); 
     return 1; 
    } 
    const int BUFSIZE = 1000; 
    char buf[ BUFSIZE ]; 
    while(fgets(buf, BUFSIZE, f)) { 
     fprintf(stdout, "%s", buf ); 
    } 
    pclose(f); 
} 
+0

dimenticato return 0 alla fine del main. e usa sizeof (buff) invece 1000 in fgets :) – bayda

+3

C++ non richiede un ritorno alla fine del main. –

+0

Vero, ma è bello avere il ritorno, in modo che sia ovvio che cosa verrà fuori dal programma. –

15

popen sicuramente fa il lavoro che stai cercando, ma ha alcuni inconvenienti:

  • Si invoca una shell sul comando si sta eseguendo (il che significa che è necessario untaint eventuali stringhe di comando utente fornita)
  • funziona solo in una direzione, o si può fornire un contributo al sottoprocesso o può leggere la sua uscita.

Se si vuole richiamare un sottoprocesso e fornire input e catturare l'uscita poi si dovrà fare qualcosa di simile:

int Input[2], Output[2]; 

pipe(Input); 
pipe(Output); 

if(fork()) 
{ 
    // We're in the parent here. 
    // Close the reading end of the input pipe. 
    close(Input[ 0 ]); 
    // Close the writing end of the output pipe 
    close(Output[ 1 ]); 

    // Here we can interact with the subprocess. Write to the subprocesses stdin via Input[ 1 ], and read from the subprocesses stdout via Output[ 0 ]. 
    ... 
} 
else 
{ // We're in the child here. 
    close(Input[ 1 ]); 
    dup2(Input[ 0 ], STDIN_FILENO); 
    close(Output[ 0 ]); 
    dup2(Output[ 1 ], STDOUT_FILENO); 

    execlp("ls", "-la", NULL); 
} 

Naturalmente, è possibile sostituire il execlp con uno qualsiasi degli altri exec funzioni come appropriato.