¿Por qué el parámetro argv para execvp no es constante?
libc (2)
La especificación POSIX dice ( http://pubs.opengroup.org/onlinepubs/009604499/functions/exec.html ):
Las matrices
argv[]
yenvp[]
de punteros y las cadenas a las que apuntan esas matrices no se modificarán mediante una llamada a una de las funciones exec, excepto como consecuencia de la sustitución de la imagen del proceso.
Creo que la const
perdida (o fuera de lugar) es simplemente una rareza histórica.
execvp se define así:
int execvp(const char *file, char *const argv[]);
Lo que impide el uso de código como este:
const char* argv[] = {"/bin/my", "command", "here", NULL};
execvp(argv[0], argv);
¿Fue esta una omisión accidental? ¿Es seguro const_cast alrededor de esto? ¿O es que algunas implementaciones de execvp realmente escriben en esa memoria?
Me encontré con esta misma situación. Debido a que execvp () tiene un char *const
como segundo parámetro, eso significa que acepta un puntero constante a un carácter. Por lo tanto, si le pasa un puntero char, podrá convertir el puntero char en un puntero constante a un char. Así que, en lugar de declararlo
const char* argv[] = {"/bin/my", "command", "here", NULL};
tratar
char* argv[] = {"/bin/my", "command", "here", NULL};
y aceptará argv[]
sin problema.