2009-03-14 16 views
106

Duplicar posible:
How can I run an external program from C and parse its output?C: ¿Ejecuta un comando del sistema y obtiene salida?

Quiero ejecutar un comando en Linux y obtener el texto devuelto de lo que da salida, pero No quieren que este texto impreso a la pantalla . ¿Hay una manera más elegante que hacer un archivo temporal?

+1

Ya discutido en varias ocasiones. – dmckee

+5

Marcado como duplicado pero no lo apunta. No creo que esta sea una solución perfecta. Al mismo tiempo que dice que está duplicado, nos lo indicará. ¡¡O mejor!! hacer un redireccionamiento basado en el número de reporteros duplicados. – erm3nda

Respuesta

4

Necesita algún tipo de comunicación entre procesos. Use un pipe o un buffer compartido.

198

Desea la función "popen". Aquí hay un ejemplo de ejecutar el comando "ls/etc" y salir a la consola.

#include <stdio.h> 
#include <stdlib.h> 


int main(int argc, char *argv[]) 
{ 

    FILE *fp; 
    char path[1035]; 

    /* Open the command for reading. */ 
    fp = popen("/bin/ls /etc/", "r"); 
    if (fp == NULL) { 
    printf("Failed to run command\n"); 
    exit(1); 
    } 

    /* Read the output a line at a time - output it. */ 
    while (fgets(path, sizeof(path)-1, fp) != NULL) { 
    printf("%s", path); 
    } 

    /* close */ 
    pclose(fp); 

    return 0; 
} 
+1

Redirigir stderr a stdout puede ser una buena idea, por lo que puede detectar errores. –

+0

¿cómo puedo redirigir stderr a stdout? –

+8

debe usar 'fgets (ruta, sizeof (ruta), fp)' no 'sizeof (ruta) -1'. lea el manual – user102008

-6

Por lo general, si el comando es un programa externo, puede usar el SO para ayudarlo aquí.

command > file_output.txt 

lo que el código C estaría haciendo algo así como

exec("command > file_output.txt"); 

continuación, puede utilizar el archivo file_output.txt.

+1

El cartel descarta explícitamente el uso de archivos temporales, pero es un enfoque válido para algunos casos. Solo asegúrate de no utilizar un nombre de archivo estático, usa un nombre de archivo aleatorio seguro o abrázate a ataques de enlace simbólico que sean problemas de seguridad. –

+5

esta respuesta es completamente incorrecta, porque el argumento pasado a exec no es un comando de shell. – Alnitak

+0

@Alnitak pero este * es * un ejemplo ... a quién le importa si el argumento no es un comando real - ¿no es obviamente * no * un comando? –

Cuestiones relacionadas