我正在构建一个Linux Shell,而我目前头疼的是将命令行参数传递给fork/exec'ed程序和系统函数。用命令行参数分叉
当前所有输入都在空格和新行上标记为全局变量char * parsed_arguments。例如,输入DIR/USA/FolderB中将被标记化如:
parsed_arguments[0] = dir
parsed_arguments[1] = /usa/folderb
parsed_arguments一切标记化完美;我现在的问题是,我只希望获取一部分parsed_arguments,它排除了要在shell中运行的可执行文件的命令/第一个参数/路径,并将它们存储在一个名为passed_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”)。
每个命令的参数列表末尾是否有空指针? – 2013-04-20 00:14:04
@JonathanLeffler它们都应该是字符串,最后应该有一个空指针。 – blutuu 2013-04-20 00:15:01
好的;这是一个陷阱避免。在分叉代码中,这是一个错字吗? 'execv(parsed_arguments [0],passed_arguments);'它应该是'execv(parsed_arguments [0],parsed_arguments);'?请注意,如果'execv()'返回,它将失败,但代码继续让失败的子继续。几乎总是'exit()'或等效的'execv()'失败后的等价物。并且也建议一条消息。 – 2013-04-20 00:18:18