2012-01-11 58 views
6

Cuando llamo al execvp, por ejemplo execvp(echo, b) donde b es una matriz de argumentos para el comando a, ¿cambiará esta matriz más adelante afectará a la llamada execvp realizada anteriormente? Cuando intento llamar a execp (echo, b), termina imprimiendo (nulo) en lugar del contenido dentro de b. ¿Alguien puede señalar por qué y qué debo hacer para pasar los argumentos correctamente?¿Manejando argumentos array de execvp?

Respuesta

12

Después de llamar al exec() o uno de sus familiares, su programa original ya no contiene . Eso significa que nada en ese programa puede afectar nada después de la llamada exec(), ya que nunca se ejecuta. ¿Tal vez no estás construyendo tu matriz de argumentos correctamente? Aquí está un ejemplo rápido de trabajo de execvp():

#include <unistd.h> 

int main(void) 
{ 
    char *execArgs[] = { "echo", "Hello, World!", NULL }; 
    execvp("echo", execArgs); 

    return 0; 
} 

Desde el execvp() man page:

Los execv(), execvp(), y execvpe() funciones proporcionan una matriz de punteros a terminada en cero cadenas que representar la lista de argumentos disponible para el nuevo programa. El primer argumento, por convención, debe apuntar al nombre de archivo asociado con el archivo que se está ejecutando. La matriz de punteros debe terminarse con un puntero NULL.

Un error común es omitir la parte sobre "El primer argumento, por convención, debe apuntar al nombre de archivo asociado con el archivo que se está ejecutando". Esa es la parte que asegura que echo obtiene "eco" como argv[0], de lo que presumiblemente depende.

+0

En lugar de usar echo, usé otro programa que esencialmente imprime todo en su matriz argv. Siempre asumí que argv [0] sería el nombre del comando en sí (el primer parámetro de execv), pero en este caso después de llamar a execv, argv [0] no lo era. Más bien fue el segundo param de la execv. ¿Puedes aclarar esto? – Lucas

+0

Bueno, cuando pasó la lista de argumentos a 'execv', ¿configuró' argv [0] 'con el nombre del comando? La matriz que pasa como el segundo argumento 'execvp' * se convierte en *' argv' en el nuevo programa, por lo que debe configurarlo de la manera que cabría esperar. –

+0

Este código rompe const correctness. Prefiero escribir const char * args [] = {...}; ¡pero el prototipo para execvp requiere que las cadenas en args sean escribibles! – user877329

0

Recuerde que después de exec llame su programa se intercambia por uno nuevo. Ya no se está ejecutando, por lo que cualquier código en el mismo proceso después de la llamada exec es, de hecho, inalcanzable.

¿Estás seguro de que b array termina con NULL? El último elemento debe ser NULL para que el ejecutor funcione correctamente. Además, recuerde configurar su primer parámetro a "echo" también (es argv [0]).

Trate

execlp("echo", "echo", "something", NULL); 

Por cierto, execlp es un poco más cómodo de usar, se puede pasar tantos parámetros como desee.

+1

Así no es como funciona 'execvp()'. –

+0

Por lo que entiendo, execvp toma el comando y la matriz argv. En el momento de la llamada a execvp, tanto el comando como la matriz argv no eran NULL. Sin embargo, cuando se llamó a echo, no pareció tener ningún argumento. – Lucas

+0

Lo sentimos, error tipográfico significaba 'execlp' ... –

Cuestiones relacionadas