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() 有 achar *const
作为第二个参数,这意味着它接受一个指向 char 的常量指针。因此,如果您将指针 char 传递给它,它将能够将指针 char 转换为指向 char 的常量指针。所以,而不是声明它
const char* argv[] = {"/bin/my", "command", "here", NULL};
尝试
char* argv[] = {"/bin/my", "command", "here", NULL};
它会argv[]
毫无问题地接受。