Esto es sólo una situación en la C/C++ const estilo no funciona muy bien. En realidad, el kernel no va a modificar los argumentos pasados a exec(). Solo va a copiarlos cuando cree un nuevo proceso. Pero el sistema de tipos no es lo suficientemente expresivo como para tratarlo realmente bien.
Mucha gente en esta página propone hacer que exec tome "char **" o "const char * const []". Pero ninguno de esos realmente funciona para tu ejemplo original. "char **" significa que todo es mutable (ciertamente no es cierto para la constante de cadena "/ usr/bin/whatever"). "const char * const []" significa que nada es mutable.Pero entonces no puede asignar ningún valor a los elementos de la matriz, ya que la matriz en sí misma es const.
lo mejor que podría hacer es tener una constante C de tiempo de compilación como esta:
const char * const args[] = {
"/usr/bin/whatever",
filename.c_str(),
someparameter.c_str(),
0};
Esto realmente trabajar con la firma de tipo propuesto de "const char * const []". Pero, ¿y si necesitas una cantidad variable de argumentos? Entonces no puede tener una constante en tiempo de compilación, pero necesita una matriz mutable. Entonces has vuelto a las cosas tontas. Esa es la verdadera razón por la cual la firma de tipo del ejecutivo toma "const char **" para los argumentos.
Por cierto, los problemas son los mismos en C++. No puede pasar un std :: vector < std :: string> a una función que necesita un std :: vector < const std :: string>. Tienes que encasillar o copiar todo el std :: vector.
Creo que puede usar const_cast con seguridad si está seguro de que el programa que ejecuta no cambia sus argumentos. La implementación de execv() no. – Vanuan
He estado escribiendo envoltorios C++ para cada llamada al sistema que realizo, por lo que la llamada al sistema arroja excepciones en lugar de tener que verificar los valores devueltos. Como parte de eso, acabo de hacer un conjunto de sobrecargas que hacen todo el 'const_cast'ing para mí, así que no tengo que tenerlos esparcidos por todo el código. Necesita definiciones de execve para que esto funcione debido a const/non-const para ambos argumentos. Uno, por supuesto, es la definición del sistema. Los otros son solo funciones en línea que se reenvían a los dados dados los moldes apropiados. – Omnifarious