【问题标题】:execvp and type of parameters - ansi cexecvp 和参数类型 - ansi c
【发布时间】:2012-10-18 18:13:50
【问题描述】:

我在使用 execvp() 时遇到问题。 execvp() 期望类型 char * const* 作为第二个参数。我想解析传递给应用程序的参数(在argv 中)并创建一个该类型的数组。例如,用户正在调用二进制文件,如下所示:

./myapp "ls -a -l"

然后我从中创建以下数组:

{"ls", "-a", "-l", NULL}

现在,我的代码如下所示:

    const char* p[10];
    char temp[255] = "ls -a -l";

    p[0] = strtok(temp, " ");
    for(i=0; i<9; i++) {
        if( p[i] != NULL ) {
            p[i+1] = strtok(NULL, " ");
        } else {
            break;
        }
    }

它有效,但我收到警告:

main.c:47: warning: passing argument 2 of ‘execvp’ from incompatible pointer type /usr/include/unistd.h:573: note: expected ‘char * const*’ but argument is of type ‘const char **’

如何正确地进行

【问题讨论】:

  • 您在代码中的哪个位置调用 execvp()test 变量在 strtok() 中做什么,我猜 temp 变量应该是。你在哪里定义了test 变量?
  • 当然test是临时的,我只是写了一个例子。我正在调用 execvp(p[0], p)... 问题出在 p 类型上。
  • 无论如何,问题解决了。谢谢。
  • 顺便说一句:你的循环逻辑有问题。如果输入字符串中恰好有 9 个或更多标记,则 p[] 数组将没有最终的 NULL 指针。
  • 我知道。它只是一个例子。在我的代码中,我将使用 malloc/realloc。

标签: c strtok argv execvp


【解决方案1】:

你可以使用char *p[10]

分解:char *const *p 表示“指向非常量字符的常量指针的非常量指针”——也就是说,p 是可写的,p[0] 是不可写的,而p[0][0] 是可写的。

【讨论】:

  • 谢谢。你知道它是否安全吗?
  • 是的。根据 POSIX 2008 规范,exec 函数都不会写入字符串; char *const* 用于兼容性(而不是更正确的 const char *const*)。
【解决方案2】:

问题在于execvp的第二个参数是char * const *,它是一个“指向非常量数据的常量指针”。您正在尝试将const char ** 传递给它,这是一个“指向常量数据的指针”。

解决这个问题的方法是使用char ** 而不是const char **(因为对于任何类型的 X(但 在指针的顶层):

char* p[10];
p[0] = ...;
// etc.

请注意,如果您确实需要插入const char * 参数,则可以将它们转换为char *,只要您不修改它们即可。尽管exec* 系列函数的参数被声明为非const,但它们永远不会修改它们(参见POSIX 2008 specification)。那里的理由解释了为什么它们被声明为非const

【讨论】:

  • 哇,一个出乎意料的令人困惑的问题的好答案。感谢您提供 POSIX 参考,否则这种合理的荒谬似乎完全不合理!
猜你喜欢
  • 2014-03-20
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 2015-11-01
  • 2012-09-21
  • 1970-01-01
相关资源
最近更新 更多