Подтвердить что ты не робот

Почему параметр 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 действительно записывают в эту память?

4b9b3361

Ответ 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[] без проблем.