我试图使用命令行发送参数发送到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
之后,程序冻结,不显示命令!
任何帮助?
答案 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);
}
}
当然,如果您没有传递可变数量的参数,则没有必要使用execvp
和vec
; 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);
}
}
}