[英]Why does `execvp` take a `char *const argv[]`?
我想知道两个exec函数之间是否存在const
-ness不同的原因,如果这只是Single Unix Spec中的一个错误:
摘自Linux手册页,它似乎与Single Unix Specification一致 ,这里有两个版本的exec
:
int execlp(const char * file , const char * arg , ...);
int execvp(const char * file , char *const argv []);
execlp
将其参数作为const char *
,它需要两个或多个。 C中的const
是一个承诺,该函数不会更改指向的数据,在这种情况下,构成字符串的实际字符( char
)。
execvp
将其参数作为指针数组。 然而,正如您所期望的那样, const
关键字位于不同的位置而不是指向const char *
的指针数组 - 这对于C. execvp
来说很重要,因为它可能会很好地修改字符串中的字符,但是它承诺不修改数组 - 即指向字符串的指针。 所以,换句话说,
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! */
/* ⋮ */
}
特别是,这使得使用C ++的std::string
的to_cstr()
方法调用execvp变得很困难(技术上是禁止的),该方法返回const char *
。
似乎execvp
真的应该采用const char *const argv[]
,换句话说,它应该保证不做上述任何一种改变。
引用您链接的页面:
关于
argv[]
和envp[]
作为常量的声明是为了使未来的语言绑定编写者明确表示这些对象是完全不变的。 由于ISO C标准的限制,不可能在标准C中陈述该想法。为exec函数指定argv[]
和envp[]
参数的两个const
级别可能似乎是自然的选择鉴于这些函数不修改指针数组或函数指向的字符,但这将禁止现有的正确代码。
基本上, execlp
和execvp
上的const
限定是完全兼容的,因为它们对相应的参数指定了相同的限制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.