【发布时间】:2013-04-13 11:16:05
【问题描述】:
我正在构建一个 Linux Shell,我目前最头疼的是将命令行参数传递给分叉/执行的程序和系统函数。
目前,所有输入都在全局变量 char * parsed_arguments 中以空格和换行符进行标记。例如,输入 dir /usa/folderb 将被标记为:
parsed_arguments[0] = dir
parsed_arguments[1] = /usa/folderb
parsed_arguments 完美地标记了所有内容;我现在的问题是我希望只获取 parsed_arguments 的一个子集,它不包括要在 shell 中运行的命令/第一个参数/可执行文件路径,并将它们存储在一个名为 pass_arguments 的新数组中。
所以在前面的例子中 dir /usa/folderb
parsed_arguments[0] = dir
parsed_arguments[1] = /usa/folderb
passed_arguments[0] = /usa/folderb
passed_arguments[1] = etc....
目前我对此没有任何运气,所以我希望有人可以帮助我。这是我到目前为止工作的一些代码:
我如何尝试复制参数:
void command_Line()
{
int i = 1;
for(i;parsed_arguments[i]!=NULL;i++)
printf("%s",parsed_arguments[i]);
}
读取命令的功能:
void readCommand(char newcommand[]){
printf("readCommand: %s\n", newcommand);
//parsed_arguments = (char* malloc(MAX_ARGS));
// strcpy(newcommand,inputstring);
parsed = parsed_arguments;
*parsed++ = strtok(newcommand,SEPARATORS); // tokenize input
while ((*parsed++ = strtok(NULL,SEPARATORS)))
//printf("test1\n"); // last entry will be NULL
//passed_arguments=parsed_arguments[1];
if(parsed[0]){
char *initial_command =parsed[0];
parsed= parsed_arguments;
while (*parsed) fprintf(stdout,"%s\n ",*parsed++);
// free (parsed);
// free(parsed_arguments);
}//end of if
command_Line();
}//end of ReadCommand
分叉函数:
else if(strstr(parsed_arguments[0],"./")!=NULL)
{
int pid;
switch(pid=fork()){
case -1:
printf("Fork error, aborting\n");
abort();
case 0:
execv(parsed_arguments[0],passed_arguments);
}
}
这是我的 shell 当前输出的内容。我第一次运行它时,它会输出一些接近我想要的东西,但每次后续调用都会破坏程序。此外,每个额外的调用都会将解析后的参数附加到输出中。
这是原始外壳产生的。再次接近我想要的,但不完全。我想省略命令(即“./testline”)。
【问题讨论】:
-
每个命令的参数列表末尾是否有一个空指针?
-
@JonathanLeffler 它们都应该是字符串,最后应该有一个空指针。
-
好的;这是避免的一个陷阱。在分叉代码中,这是一个错字吗?
execv(parsed_arguments[0], passed_arguments);应该在哪里execv(parsed_arguments[0], parsed_arguments);?请注意,如果execv()返回,它会失败,但您的代码会继续让失败的孩子继续。在失败的execv()或等效项之后几乎总是exit()或等效项。也推荐留言。 -
仔细阅读简介,我发现您同时拥有
parsed_arguments和passed_arguments;这些名称彼此非常接近,容易引起混淆和错误。不要忘记传递给向量中execv()的参数包括位置 0 处的程序名称。如果您的passed_arguments数组省略了命令名称,您将丢失命令的第一个参数(它被视为命令名称)。 -
将一些 cmets 处理成一个答案...请研究产生 SSCCE 的含义 (Short, Self-Contained, Correct Example)。一条评论:这段代码全局变量太多,函数参数不够。
标签: c linux exec fork command-line-arguments