C如何使用cmd传递参数并在execvp中使用它

时间:2016-03-13 21:37:23

标签: c

我试图使用命令行发送参数发送到C文件,之后使用它作为execvp函数的参数

int main (int argc, char **argv){
    pid_t p;

    char * vec [] = {*argv, (char*)NULL};

    for(i = 0; i < argc ; i++){ 
        p = fork(); 

        if(p > 0 ){
            //Fork validations
        }else{
            execvp(vec[0], vec);
            exit(1);
        }
    }
}    

在shell中我试图使用 ./可执行文件3 ls ps

之后,程序冻结,不显示命令!

任何帮助?

2 个答案:

答案 0 :(得分:1)

你的问题很简单。而不是从你的参数执行命令,你的定义

char *vec[] = {*argv, (char*)NULL};

或更容易理解,

char *vec[] = {argv[0], (char*)NULL};

并且您永远不会更改此vec,这意味着您正在重新执行名称位于argv[0]中的命令...并且它是您的可执行文件的名称< / strong>所以你的代码一直在执行自己并且一直在分叉,创建一个 fork bomb

您要做的是从参数执行命令。我不确定3在参数中做了什么,但我认为你想从那里执行其余的命令:

char *vec[] = {0, 0};
// only process arguments starting from 2 (a.k.a ls in your example)
for(i = 2; i < argc ; i++){ 
    vec[0] = argv[i];
    if (!fork()) {
        execvp(vec[0], vec);
        exit(1);
    }
}

当然,如果您没有传递可变数量的参数,则没有必要使用execvpvec; execlp可以正常使用:

for (i = 2; i < argc; i++) {
    if (!fork()) {
        execlp(argv[i], argv[i], (char*)0);
        exit(1);
    }
}

答案 1 :(得分:0)

你很幸运我目前在同一主题上有一个分配。

1)你为什么使用

  

char * vec [] = { argv,(char )NULL};

直接使用argv,这样可以使你的代码更加清晰。

我建议制作一个通用功能,将选项和参数中的输入分开,并使用回调使其更灵活,但这取决于您。 像这样的东西

typedef int (*pCallback) (char *, char*, void *);
int parseCmdLine(int argc, char *argv[], pCallback p, void
*userData); 
int parseCallback(char *key, char *value, void *userData); 

您可以将原型发布到您的功能中,以便更清楚您想要做什么。

另外,你还忘记了我的声明。我建议使用像argv_counter更清晰的东西:

  

int argv_counter;

您发现更完整的代码并不是很清楚。这就是我要解决的问题以及我看不到的重点 为什么不直接传递argv或argv [0],两者都没有任何意义。

  

execvp(argv [0],argv);

int main (int argc, char **argv){
    pid_t p;
    int argv_counter;
    char * vec [] = {*argv, (char*)NULL};

    for(argv_counter = 0; argv_counter < argc ; argv_counter++){ 
        p = fork(); 

        if(p > 0 ){
            //Fork validations
        }
        else{
            execvp(argv[0], argv);
            exit(1);
        }
    }
}