Почему параметр argv для execvp не const?
execvp определяется следующим образом:
int execvp(const char *file, char *const argv[]);
Это исключает использование такого кода:
const char* argv[] = {"/bin/my", "command", "here", NULL};
execvp(argv[0], argv);
Было ли это случайным упущением? Это безопасно для const_cast вокруг этого? Или некоторые реализаторы execvp действительно записывают в эту память?
Ответы
Ответ 1
В спецификации POSIX говорится (http://pubs.opengroup.org/onlinepubs/009604499/functions/exec.html):
Матрицы argv[]
и envp[]
указателей и строки, для которых эти точки массива не должны быть изменены вызовом одной из функций exec, кроме как в результате замены образа процесса.
Я думаю, что пропавшая (или неуместная) const
- просто историческая странность.
Ответ 2
Я столкнулся с такой же ситуацией. Поскольку execvp() имеет char *const
как второй параметр, это означает, что он принимает постоянный указатель на char. Поэтому, если вы передадите ему указатель char, он сможет наложить указатель char на постоянный указатель на char. Итак, вместо объявления
const char* argv[] = {"/bin/my", "command", "here", NULL};
попробовать
char* argv[] = {"/bin/my", "command", "here", NULL};
и он будет принимать argv[]
без проблем.