我想知道两个exec函数之间是否存在不同的原因const,如果这只是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关键字在不同的位置 - 这对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! */
/* ? */
}
Run Code Online (Sandbox Code Playgroud)
特别是,这使得使用C++ std::string的to_cstr()方法调用execvp变得很困难(技术上是禁止的)const char *.
看起来execvp真的应该采取const char *const argv[],换句话说,它应该承诺不做上述任何一种变化.
引用您链接的页面:
包含有关
argv[]和envp[]成为常量的语句,以明确未来的语言绑定编写者,这些对象是完全不变的.由于ISO C标准的限制,不可能在标准C中陈述该想法.指定两个级别const- 对exec函数argv[]和envp[]参数的限定似乎是自然的选择,因为这些函数不是修改指针数组或函数指向的字符,但这将禁止现有的正确代码.
基本上const资格execlp和execvp完全兼容,因为它们对相应的参数指定了相同的限制.