我想知道两个 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 *
,并且它需要两个或多个参数。const
在 C 中是一个承诺,该函数不会更改指向的数据,在这种情况下char
,构成字符串的实际字符 ()。
execvp
而是将其参数作为指针数组。const char *
然而,关键字不是你所期望的指针数组,而是const
在不同的位置——这对 Cexecvp
来说很重要。说它可能会修改字符串中的字符,但它承诺不会修改数组——即指向字符串的指针。所以,换句话说,
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[]
,换句话说,它应该承诺不做上述任何一项更改。