2012-05-04 18 views
23

execvp se define así:¿Por qué el parámetro argv para execvp no es const?

int execvp(const char *file, char *const argv[]); 

que impide código como este sea utilizado:

const char* argv[] = {"/bin/my", "command", "here", NULL}; 
execvp(argv[0], argv); 

¿Era esta una omisión accidental? ¿Es seguro const_cast alrededor de esto? ¿O algunas implementaciones de execvp realmente garabatean en esa memoria?

+3

Aunque la familia de funciones 'exec *' no modifica sus argumentos como se indica en la especificación POSIX, tenga en cuenta que en Windows, ['CreateProcess' requiere una línea de comando escribible] (http://blogs.msdn.com /b/oldnewthing/archive/2009/06/01/9673254.aspx). –

Respuesta

7

La especificación POSIX dice (http://pubs.opengroup.org/onlinepubs/009604499/functions/exec.html):

Los argv[] y envp[] arrays de punteros y las cuerdas a las que los puntos matrices no podrán ser modificados por una llamada a una de las funciones exec, excepto como una consecuencia de reemplazar la imagen del proceso.

creo que la falta (o extraviado) const es simplemente una rareza histórica.

+5

El 'const' faltante no es una rareza histórica; más bien, es porque no puede convertir de 'char **' a 'const char * const *' en C sin un molde (pero usted * puede * en C++). –

+2

@ Adam: correcto. Esa es la respuesta a la primera pregunta en la publicación. Espacié sobre eso: http://c-faq.com/ansi/constmismatch.html –

+1

Consulte también la sección JUSTIFICACIÓN al final de la especificación POSIX para el ejecutivo. Explica la elección de la omisión de const. –

-1

Me encontré con esta misma situación. Debido a que execvp() tiene un char *const como el segundo parámetro, eso significa que acepta un puntero constante a un carácter. Por lo tanto, si le pasa un carácter de puntero, podrá convertir el carácter de puntero en un puntero constante a carácter. Así, en lugar de declarar que

const char* argv[] = {"/bin/my", "command", "here", NULL}; 

tratar

char* argv[] = {"/bin/my", "command", "here", NULL}; 

y aceptará argv[] sin problema.

+0

'Constante a un puntero char' no tiene sentido. – EJP

+0

Quise decir puntero constante a un char. Seguí adelante y corrigí el error de gramática. –

+0

Eso solo mueve el error/advertencia de la línea 'execvp()' a la declaración de asignación (a menos que tenga un compilador muy indulgente). –

Cuestiones relacionadas