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

Почему `execvp` принимает` char * const argv [] `?

Мне интересно, существует ли причина между двумя функциями exec, отличными от const -ness, если это всего лишь ошибка в спецификации Single Unix:

Извлечение из man-страницы Linux, которая, по-видимому, соответствует спецификации Single Unix Specification, вот две версии exec:

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

execlp принимает свои аргументы как const char *, и он принимает два или более из них. const в C является обещанием, что функция не изменит заостренные данные, в этом случае фактические символы (char), которые составляют строку.

execvp вместо этого принимает свои аргументы как массив указателей. Однако вместо массива указателей на const char *, как и следовало ожидать, ключевое слово const находится в другом месте - и это очень важно для C. execvp говорит, что он может хорошо модифицировать символы в строки, но promises не изменять массив, то есть указатели на строки. Итак, другими словами,

int fake_execvp(const char *file, char *const argv[]) {
    argv[0] = "some other string"; /* this is an error */
    argv[0][0] = 'f';              /* change first letter to 'f': this is perfectly OK! */
    /* ⋮ */
}

В частности, это затрудняет (технически, запрещено) вызов execvp с использованием метода С++ std::string to_cstr(), который возвращает const char *.

Кажется, что execvp действительно должен взять const char *const argv[], другими словами, он должен обещать не делать ни одного из вышеуказанных изменений.

4b9b3361

Ответ 1

Чтобы процитировать страницу, на которую вы ссылаетесь:

Утверждение о константах argv[] и envp[] является четко указать будущим писателям языковых привязок, что эти объекты полностью постоянные. Из-за ограничения ISO C Стандарт, нельзя утверждать, что идея в стандарте C. Определение двух уровней const - квалификации для argv[] и Параметры envp[] для функций exec могут казаться естественными выбор, учитывая, что эти функции не изменяют ни массив указатели или символы, на которые указывает функция, но это будет запрещать существующий правильный код.

В принципе квалификация const на execlp и execvp полностью совместима в том смысле, что они указывают одинаковые ограничения на соответствующие аргументы.