2009-03-22 24 views
20

Solo quiero saber cuál es la mejor manera de ejecutar un comando externo en C++ y cómo puedo obtener el resultado si hay alguno?¿Cómo puedo ejecutar comandos externos en C++/Linux?

Editar: Creo que tenía que decir que soy un novato aquí en este mundo, por lo que creo que voy a necesitar un ejemplo de trabajo. Por ejemplo, quiero ejecutar un comando como:

ls -la 

¿cómo puedo hacer eso?

+0

ver el enlace de @Mehrdad, tiene un ejemplo con ls =) – bayda

Respuesta

22

Utilice la función popen.

Ejemplo (no completa, código de calidad de la producción, sin control de errores):

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

@Daniel Esto no es código de producción. Esta es una respuesta en un foro en línea que se supone que le da a uno la idea de alto nivel de la función popen y sus argumentos. Cualquiera que tenga el hábito de tratar todas las respuestas de Stack Overflow como código de producción tiene problemas más serios que esto. Además, cualquier buffer que tenga la posibilidad de desbordamiento no es una amenaza de SEGURIDAD SERIA MUERTA DIGNO DE GRITAR. Sin un modelo de amenaza específico y saber qué se confía y qué no está en el entorno particular al que se aplica algo, la discusión sobre la seguridad es discutible. –

+0

@Daniel Creo que su primer comentario va a disuadir a la mayoría de las personas. ¿Por qué no proporciona un enlace a una página CERT? Estoy seguro de que esto está en algún lugar de [notas de programación segura] (https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId=4063380). Mehrdad puede incluso actualizar su respuesta. –

+0

@Daniel Te escucho. Claro, una respuesta más completa advirtiendo sobre todos los posibles errores podría ser una mejor respuesta. Es posible que pueda escribir un libro sobre los errores en tres líneas de código. Sin embargo, está claro que lo que está relacionado con esta pregunta es "popen" y no cómo se procesará el resultado del proceso externo ... –

1

uso sistema ("ls -la") función

+0

No sé por qué esto fue desestimado ... –

+1

No responde la pregunta. No hay forma de obtener el resultado de una llamada al sistema(). – greyfade

+0

funciona hombre ... lo he usado varias veces en devC++ IDE .... – suresh

20

Un ejemplo:

#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

se olvidó devolver 0 al final de main. y use sizeof (buff) en vez de 1000 en fgets :) – bayda

+3

C++ no requiere un retorno al final de main. –

+0

Es cierto, pero es bueno tener la devolución, por lo que es obvio lo que saldrá del programa. –

15

popen definitivamente hace el trabajo que está buscando, pero tiene algunos inconvenientes:

  • Se invoca un shell en el comando que está ejecutando (lo que significa que es necesario ningún untaint cadenas de comandos de usuario proporcionado)
  • sólo funciona en una dirección, o bien se puede proporcionar información al subproceso o puede leer su salida.

Si desea invocar un subproceso y proporcionar entrada y salida de capturar a continuación, tendrá que hacer algo como esto:

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

Por supuesto, se puede reemplazar el execlp con cualquiera de los otros exec funciona según corresponda

Cuestiones relacionadas