Почему аргументы execv*() несовместимы с execl*()?
Почему argv
аргументы в пользу execv*()
семейство функций char * const []
тогда как execl*()
семья arg0...n
Арги const char *
? Это просто ошибка в стандарте, и это должно быть const char * const []
или есть причина для строк быть неконстантными в случае массива, но const в случае явно переданных аргументов?
int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
int execv(const char *path, char *const argv[]);
int execle(const char *path, const char *arg0, ... /*,
(char *)0, char *const envp[]*/);
int execve(const char *path, char *const argv[], char *const envp[]);
int execlp(const char *file, const char *arg0, ... /*, (char *)0 */);
int execvp(const char *file, char *const argv[]);
1 ответ
Я не могу найти достоверный ответ, но подозреваю, что две подписи вызовов различаются в зависимости от того, как они созданы и как они используются.
В случае execl*()
вполне возможно, что ваша функция была передана const char*
который вы передаете. Если подпись execl*()
не было const char*
тогда вы получите предупреждения компилятора.
В случае execv*()
, поскольку это массив, который вы, вероятно, построили, поддерживать постоянство строкового значения не так важно. Но важно то, что execv*()
не манипулировать указателями - в противном случае возможно, что последний элемент может быть изменен, поэтому он больше не будет правильно указывать на NULL - что необходимо.
Возможно, кто-то с более близким знакомством со спецификацией, чтобы уточнить, где я мог пойти не так.