【问题标题】:From argv to execvp从 argv 到 execvp
【发布时间】:2016-03-06 18:29:26
【问题描述】:

所以我有一个我无法解决的问题。 我正在编写一个通过管道执行一些操作系统功能的 C 程序。使用 execvp(const char *file, char *const argv[]); 完成执行。

在我的主函数中,我想将除第一个字符数组之外的整行传递给程序 (argv),并将其传递给 grep。目前一切正常,但我不断收到警告:

warning: initialization from incompatible pointer type [enabled by default]
const char* grep = argv;
                   ^

我的代码如下所示。在子句if(1 < argc) 中,我希望能够发送argv,第一个帖子修改为newPipeline,格式与printenv 相同,排序和更少。

int main(int argc, char** argv, char **envp){

    const char* printenv[] = {"printenv", NULL, NULL};
    const char* sort[] = {"sort", NULL, NULL};
    const char* less[] = {"less", NULL, NULL};
    if(1<argc){
        argv[0] = "grep";
        const char* grep = argv; 
        const char* const* commands[] = {printenv, sort, grep, less, NULL};
        newPipeline((char* const**)commands, 0, STDIN_FILENO);
    }
    //FROM HERE ON IT WORKS
    else{
        const char* const* commands[] = {printenv, sort, less, NULL};
        newPipeline((char* const**)commands, 0, STDIN_FILENO);
    }
    if(signal(SIGCHLD, SIG_IGN) == SIG_ERR){
        perror("A problem with the children");
    }
    exit(0);
}

我知道指针类型是错误的。我应该为grep 构建一个全新的数组,还是应该像我现在尝试做的那样,将指针转换为正确类型的指针。如果是后者,那将是哪些指针?

【问题讨论】:

  • 您应该将您的数组(argv)复制到另一个中以使用
  • argv 不是const。你可以随意修改它(grep 也是如此),所以每次传递它时都要复制一份。
  • 您想将 argv 的元素连接成一个由空格分隔的字符串,对吗?这就是你在这种情况下所缺少的
  • @someguy。没有。只需按原样传递向量即可。
  • @Mad Physicist:那么没有意义。 grep 是字符串,不是数组字符串。

标签: c pointers posix


【解决方案1】:

您的 grep 变量需要是指向字符串数组或字符串数​​组(而不仅仅是字符串)的指针。

类似:

argv[0] = "grep";
const char** grep = (const char**)argv; //make grep point to the modified char** argv;

应该这样做,或者构造一个新数组:

const char* grep[argc+1]; 
grep[0] = "grep";
grep[argc]=NULL;
for(int i=1; i<argc; i++){
  grep[i] = argv[i];
}

顺便说一句,我相信你只需要一个NULL 在每个字符串数组的末尾。

【讨论】:

    【解决方案2】:

    问题出在这里

    const char* grep = argv; 
    

    C 不为 const 类型提供内部类型转换。如果您的动机是将argv 的数组复制到grep,那就错了,请使用strcpy 或任何此类函数来克隆该数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多