木客伊人 2017-07-21 15:37 采纳率: 0%
浏览 771

unix操作系统求解,实现不了内部和外部命令,但是能执行里面的输出语句,求大神帮忙,急!!!!

#include
#include
#include
#include
#include

#define length 80
#define MAX 80
char **p=NULL,*p1[MAX]={NULL};

void strtok_hostname() //对提示符的处理
{
char s1[80],s2[80],s3[80],s4[80];
char *hostname;
char *ttp=getenv("HOME");

int i,j,k=0;
printf("[%s@",getenv("USER")); //打印当前用户
hostname = getenv("HOSTNAME");
if (hostname)
strcpy(s1,hostname); //若为空,则s1为空
else

strcpy(s1,"localhost"); //否则s1为Loalhost

strcpy(s2,getcwd(NULL,length)); //s2获取当前路径
for(i=0;s1[i]!='.'&&s1[i]!='\0';i++)
{
printf("%c",s1[i]); //当HOSTNAME遇到‘.’时截取并打印
}
printf(":"); //用于跟操作系统提示符区别开来
if (strcmp(s2,"/")==0) //若路径为‘/’时。打印该路径
{
printf("/");
}
else if (strcmp(s2,ttp)==0) //否则若为root时,用‘~’来表示root
{
printf("~");
}
else
{
j = strlen(s2);
while(s2[j--]!='/'); //扫描路径,遇到‘/’时截取
printf("%s",&s2[j+2]);
}
printf("]#");

}

int strtok_order()

{

char s[100];
int w[100];
int cnt=1,n=0,m=0,flag=1;
int j,i;
int wn=0,len;
char * strtok(char *s, const char *delim);  
char *q,*g;
char *d=";" , *delim=" ";
fgets(s,100,stdin);
for(i=0;s[i] != '\0';i++)               //为了计算输入命令的条数,这样方便分配空间的个数     
    {
        if(s[i] == ';' && s[i+1] != '\n' )      //
        {
            cnt++;
        }
    }
printf("%d\n",cnt); //除分号以外的单词个数
p= (char **) malloc (cnt * sizeof(char *));                     //申请二维空间**p     
for(i=0;i<cnt;i++)
   {
     p[i]=(char *) malloc (4*sizeof(char));
   }
    q=strtok(s,d);                  //为了删除分号
   for(i=0;i<cnt;i++)               //把以空格截取的命令拷贝到p[i]中 
    {
        if(q!=NULL)
        {
            strcpy(p[i],q);   
            q=strtok(NULL,d);
        }
        printf("p[%d]=%s\n",i,p[i]);
    }
   for(i=0;i<cnt;i++)
   {
       p1[n]=strtok(p[i],delim);//删除空格
       //n=0;
       while(p1[n]!=NULL)
       { 
           n++;
           p1[n]=strtok(NULL,delim);

       }
   } 
   printf("%d\n",n);
   for(j=0;j<n;j++)
   {
       printf("p1[%d]=%s\n",j,p1[j]);
   }

  return n ;

}

char *oldpath="./"; //默认初始化为当前目录

void cd_return() //实现cd -
{
char *newpath;
newpath=getcwd(NULL,225);//获取当期路径
chdir(oldpath); //切换到上一次访问的路径
oldpath=newpath; //把当期路径保存成上一次访问的路径
printf("cd_return\n");
}

void cd_filename() // 实现cd + filename
{
int i=0;
oldpath=getcwd(NULL,225);//保存当期的路径作为上一次访问的路径
chdir(p1[i+1]); //切换到filename
printf("cd_filename\n");
}

void cd_nothing() //仅实现cd

{
char *ttp;
oldpath=getcwd(NULL,225);//保存当期的路径作为上一次访问的路径
ttp=getenv("HOME"); //到HOME目录
chdir(ttp); //回到root下
printf("cd_nothing\n");
}

void order()
{
char *str=NULL;
int i;
int status;
int cnt=strtok_order();//单词总个数
for(i=0;i<cnt;i++)
{
if((strcmp(p1[i],"cd")==0))
{
if((i+1)<cnt)
{
//printf("if i<cnt\n");
if((strcmp(p1[i+1],"-")==0))// cd -
{
cd_return();
printf("cd -\n");
}
else // cd dir
{
cd_filename();
printf("cd name\n");
}
}
else / nothing
{
cd_nothing();
printf("cd nothing\n");
}
}
else if(strcmp(p1[i],"exit")==0)

{
printf("p111111111111111111[0]=%s\n",p1[0]);
exit(0);
}
else //其他都为外部命令
{
if(fork()==0)
{
execvp(p1[0],p1);
exit(0);
}
printf("p111111111111111111[0]=%s\n",p1[0]);
wait(&status);
// i=cnt;
}
}
}

int main(int argc, char *argv[])
{
int cnt ;
while(1)

{
cnt=1;
strtok_hostname();//提示符
order(); //对命令的操作
}
return 0;
}

  • 写回答

1条回答 默认 最新

  • devmiao 2017-07-22 15:56
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型