QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 623|回复: 0

对一个简单shell的疑惑

[复制链接]
发表于 2005-1-16 15:55:09 | 显示全部楼层 |阅读模式
有一段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之间的语句,为什麽?请帮忙!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-6 17:23 , Processed in 0.037123 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表