2009-03-18 22 views

Respuesta

7

¿Funcionaría popen? Genera el proceso, luego lee/escribe con un FILE* manejar

5

Entonces su elección es system(), o usando alguna biblioteca que envuelve el desove del proceso para usted. Lo último, o la forma de núcleo rígido que quería evitar, se recomienda si desea un control preciso sobre errores, tuberías, etc.

3

sistema() es bastante fácil.

Pero debe intentar no hacer esto si puede. Los scripts funcionan mejor cuando están en la parte superior de las cosas, no debajo. Si estás en UNIX, a menudo es mucho mejor dividir el trabajo y escribir un script de alto nivel para llamar a todas las piezas.

Recuerdo ver a un programador agregar una gran cantidad de llamadas al sistema en su código C para evitar tener que aprender el shell Bourne. Pensó que era una forma inteligente y rápida de ponerlo en marcha, sin embargo, cuando falló, falló mal. Perdió grandes cantidades de tiempo depurando el desastre. Hubiera sido mucho más rápido simplemente aprender algunos comandos de shell simples ...

Paul.

1

libc tiene funciones system y popen, que funcionan un poco como esto:

int system(cont char *command) { 
    const char *argv[4] = {"/bin/sh", "-c", command}; 
    int status; 
    pid_t child = fork(); 
    if (child == 0) { 
     execve(argv[0], argv, NULL); 
     exit(-1); 
    } 
    waitpid(child, &status, 0); 
    return status; 
} 

FILE *popen(const char *command, const char *type) { 
    int fds[2]; 
    const char *argv[4] = {"/bin/sh", "-c", command}; 
    pipe(fds); 
    if (fork() == 0) { 
     close(fds[0]); 
     dup2(type[0] == 'r' ? 0 : 1, fds[1]); 
     close(fds[1]); 
     execve(argv[0], argv, NULL); 
     exit(-1); 
    } 
    close(fds[1]); 
    return fdopen(fds[0], type); 
} 

(excepto con más comprobación de errores y cosas)

Si desea un control más preciso sobre el manejo (en vez de ir a través de argumentos sh), o si desea controlar más de uno de {stdin, stdout, stderr}, tendrá que escribirlo usted mismo o buscar una biblioteca. Pero la biblioteca estándar cubre la mayoría de los casos de uso.

1

Puede hacerlo a través del sistema () llamar Este Thread es un buen ejemplo

Cuestiones relacionadas