Мне интересно, существует ли причина между двумя функциями 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[]
, другими словами, он должен обещать не делать ни одного из вышеуказанных изменений.