从 argv 到 execvp

From argv to execvp

所以我有一个无法解决的问题。 我正在编写一个 C 程序,它通过管道执行一些 OS 函数。执行是通过 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,第一个 post 修改为 newPipeline,格式与 printenv、sort 和 less 相同。

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 构建一个全新的数组,还是应该像我现在尝试做的那样,将指针转换为正确类型的指针。如果是后者,那将是哪些指针?

问题出在这里

const char* grep = argv; 

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

您的 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