从argv到execvp

时间:2015-12-02 13:31:58

标签: c pointers posix

所以我遇到了一个我无法解决的问题。 我正在编写一个C程序,通过管道执行一些OS功能。执行是用execvp(const char * file,char * const argv []);.

完成的。

在我的main函数中,我想将整行传递给程序(argv),除了第一个char-array并将其传递给grep。此刻一切正常,但我一直收到警告:

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

我的代码如下所示。在if(1 < argc)条款中,我希望能够将argv的第一个帖子修改为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建立一个全新的数组,还是应该像我现在所做的那样,将指针指向正确的指针。如果以后,哪个指针会是什么?

2 个答案:

答案 0 :(得分:2)

你的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];
}

BTW,我相信在每个字符串数组的末尾只需要一个NULL

答案 1 :(得分:1)

问题出在这里

const char* grep = argv; 

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