execvp被这样定义:
int execvp(const char *file, char *const argv[]);
这就排除了代码像这样被使用:
const char* argv[] = {"/bin/my", "command", "here", NULL};
execvp(argv[0], argv);
这是一个意外遗漏? 它是安全的const_cast解决此问题? 或者做一些execvp实现实际上是在内存乱写?
execvp被这样定义:
int execvp(const char *file, char *const argv[]);
这就排除了代码像这样被使用:
const char* argv[] = {"/bin/my", "command", "here", NULL};
execvp(argv[0], argv);
这是一个意外遗漏? 它是安全的const_cast解决此问题? 或者做一些execvp实现实际上是在内存乱写?
该POSIX规范说( http://pubs.opengroup.org/onlinepubs/009604499/functions/exec.html ):
所述
argv[]
和envp[]
指针和字符串数组到这些阵列点不得通过调用修改以exec函数之一,除非更换处理图像的结果。
我认为缺失(或放错地方) const
仅仅是一个历史的怪胎。
我遇到了这个同样的情况。 因为execvp()具有char *const
作为第二个参数,这意味着它接受一个常量指针为char。 因此,如果你传递一个指针字符它就能指针字符转换为一个常量指针为char。 如此,而不是它声明
const char* argv[] = {"/bin/my", "command", "here", NULL};
尝试
char* argv[] = {"/bin/my", "command", "here", NULL};
它将接受argv[]
没有问题。