2016-03-13 86 views
-2

我试图使用命令行发送参数C文件发送,之后把它作为一个execvp函数Ç如何使用CMD参数传递,并用它在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); 
     } 
    } 
}  

的参数并在壳我试图使用./executable 3 ls ps谁

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

任何帮助?

+0

您目前的解决方案会发生什么? – DanielGibbs

+0

程序冻结并且不显示命令 – Mark

+1

您尝试启动gdb吗? – Chirality

回答

1

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

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

或更容易理解,

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

和事实的,你从来没有改变这个vec,意味着你重新执行命令的名字是在argv[0] ...并且它的名称是您的可执行文件因此您的代码始终在执行自己并始终分叉,从而创建一个叉炸弹


你想做的是从参数中执行命令。我不知道该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); 
    } 
} 
0

你只是运气好,我现在有一个同样的问题应得的分配。

1)为什么要使用

字符* VEC [] = {的argv,(炭)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); 
     } 
    } 
}