|
有一段shell代码是这样的:
#include<string.h>
#include<stdlib.h>
int makeargv(char *s,char*delimits,char ***argvp)
{
cahr *t;
char *snew;
int numtokens;
int i;
snew=s+strspn(s,delimits);
if((t=calloc(strlen(snew)+1,sizeof(char)))==NULL)
{*argvp=NULL;
numtokens=-1;
}
else
{
strcpy(t,snew);
if(strtok(t,delimits)==NULL)
{
numtokens=0;
}
else
{
for(numtokens=1;strtok(NULL,delimits)!=NULL;numtokens++);
}
if((*argvp=calloc(numtokens+1,sizeof(char*)))==NULL)
{
free(t);
numtokens=-1;
}
else
{
if(numtokens>0)
{
strcpy(t,snew);
**argvp=strtok(t,delimits);
for(i=1;i<numtokens+1;i++)
*((*argvp)+i)=strtok(NULL,delimits);
}
else
{
**argvp=NULL;
free(t);
}
}
}
return numtokens;
}
int main()
{
char cmdline[256];
char **argv;
printf("input the command,input "quit" if you want to quit\n");
printf(">");
for(;;)
{
scanf("%s",cmdline");
if(strcmp(cmdline,"quit")==0)
break;
else
{
printf(">");
if(fork()==0)
{
if(makeargv(cmdline," ",&argv)>0)
execvp(argv[0],argv);
}
wait(NULL);
}
}
exit(0);
}
这个shell其实不能输入两个以上的命令参数。问题应出在makeargv上,它负责把 命令行转化为argv[]数组,但用printf测试却不对。比如输入
rm -i a.c结果是这样的:
rm NULL,NULL
-i NULL NULL
a.c NULL NULL
想必是指针错了,但查不出来,请高手指点我这个新手。
还有一个问题,在用debug调试时,输入 ls,执行步骤总是跳过fork与wait之间的语句,为什麽?请帮忙! |
|