28

execvp 是这样定义的:

int execvp(const char *file, char *const argv[]);

这排除了使用这样的代码:

const char* argv[] = {"/bin/my", "command", "here", NULL};
execvp(argv[0], argv);

这是一个偶然的遗漏吗?围绕这个进行 const_cast 是否安全?还是一些 execvp 实现实际上在该内存上乱写?

4

2 回答 2

9

POSIX 规范说(http://pubs.opengroup.org/onlinepubs/009604499/functions/exec.html):

argv[]指针数组和这些envp[]数组指向的字符串不应通过调用其中一个 exec 函数来修改,除非是替换过程映像的结果。

我认为失踪(或错位)const只是历史上的怪事。

于 2012-05-04T21:53:16.773 回答
-1

我遇到了同样的情况。因为 execvp() 有 achar *const作为第二个参数,这意味着它接受一个指向 char 的常量指针。因此,如果您将指针 char 传递给它,它将能够将指针 char 转换为指向 char 的常量指针。所以,而不是声明它

const char* argv[] = {"/bin/my", "command", "here", NULL};

尝试

char* argv[] = {"/bin/my", "command", "here", NULL};

它会argv[]毫无问题地接受。

于 2017-03-06T15:19:55.793 回答