⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shell1.c

📁 linux shell 命令解释器 通俗易懂 功能完整 可用于操作系统课程设计
💻 C
字号:
#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<stdlib.h>#include<string.h>#include<wait.h>#include<fcntl.h>#define COM_SIZE 20#define COM_COUNT 10#define INPUT_SIZE 100int inCommand(char* str,int& flag);int get_com(char str[]);void initial(char arg[][COM_SIZE],char* argv[]);int pipe_com(char* argv[]); int do_command(char* argv[],int& argc );int getone(char* argv1,int ptr,char str[]);int del_space(int ptr,char str[]);int deal_com(char* argv[],int argc,char str[]);void exe_com(char* argv[],int argc,int prefd[],int postfd[]);int inFile(char* argv[],int argc);int ppipe(char* argv[],int& argc);int main(){  char c;  char arg[COM_COUNT][COM_SIZE];  char str[INPUT_SIZE];  char* argv[COM_COUNT];  int flag=0;  int status=0;  int argc=0;//  char*pa;  while(1)  {    initial(arg,argv);    printf("[nenatee@localhost~]#\n");    get_com(str);      if(inCommand(str,flag)==1)//exit    {        exit(1);   //bug!!    }    else    {       argc=deal_com(argv,argc,str);          pid_t PID;      PID=fork();      if(PID==0)      {      do_command(argv,argc);//       ppipe(argv,argc);//        inFile(argv,argc);/*        if(execvp(argv[0],argv)==-1)        {            printf("命令不存在\n");             exit(1);         }*/      }      else      {          waitpid(PID,NULL,0);       }    }  flag=0;  argc=0; }  exit(0);}int inFile(char* argv[],int argc)//,int infile,int outfile){   int i=0,infile=-1,outfile=-1;   while(argv[i]){     if(strcmp(argv[i],"<")==0)         infile=i;     if(strcmp(argv[i],">")==0)         outfile=i;     i++;  }   if(infile>=0)   {      if(access(argv[infile+1],F_OK)!=0)      {          printf("No such file\n");          return 0;      }   }       pid_t pid=fork();   if(pid==0)   {       if(outfile>=0)       {          int fid=open(argv[outfile+1],O_WRONLY|O_CREAT);          printf("fjk\n");          close(1);          dup(fid);          close(fid);          argv[outfile]=(char*)0;//          argv[outfile+1]=NULL;          execvp(argv[0],argv);       }       if(infile>=0)       {          int fid2=open(argv[infile+1],O_RDONLY);          close(0);          dup(fid2);          close(fid2);          argv[infile]=(char*)0;          execvp(argv[0],argv);       }     //     execvp(argv[0],argv);   }   else       wait((int*)0);      return 0;}int do_command(char* argv[],int& argc){   int i=0,j=0;   int flag=0;   char* p;   if(strcmp(argv[0],"cd")==0)   {   int res=0;   if(argv[1]!=NULL)   {      res=chdir(argv[1]);   }   else      printf("Change dir error!\n");   if(res<0)      printf("Change dir error\n");   return 1;   }   while(argv[i])   {      flag=0;      p=argv[i];      if(strcmp(argv[i],"|")==0)         flag=1;      if(strcmp(argv[i],">")==0)         flag=2;      if(strcmp(argv[i],"<")==0)         flag=3;   //      printf("%d\n",flag);      if(flag>0)      {          switch(flag)      {        case 3:        {           if(access(argv[i+1],F_OK)!=0)           {             printf("No such file\n");             return 0;           }            int fid2=open(argv[i+1],O_RDONLY);            close(0);            dup(fid2);            close(fid2);            argv[i]=(char*)0;            execvp(argv[0],argv);          break;        }       case 2:       {           int fid=open(argv[i+1],O_WRONLY|O_CREAT);  //         printf(">>\n");            close(1);          dup(fid);          close(fid);          argv[i]=(char*)0;          execvp(argv[0],argv);             break;       }        case 1:        {           ppipe(argv,argc);          break;        }        default:          break;      }    }     i++;   }        if(execvp(argv[0],argv)==-1)        {            printf("命令不存在!\n");             exit(1);        }//    execvp(argv[0],argv);  return 0;}int ppipe(char* argv[],int& argc){   int i=0,j=0;   char* pt;   while(argv[i])   {      pt=argv[i];      if(strcmp(argv[i],"|")==0)      {          argv[i]='\0';                  if(argc==i+1)//huan zhong tiaojian ceshi keyi .the string can't be clr.         {            execvp(argv[0],argv);         }                  int pfd[2];         pipe(pfd);         int pid1=fork();       //pid_t??         if(pid1==0)         {            close(pfd[0]);            close(1);            dup(pfd[1]);	    close(pfd[1]);              execvp(argv[0],argv);         }         else         {            argv[i]=pt;            waitpid(pid1,NULL,0);            int m,n;            for(m=i+1,n=0;argv[m]!='\0';m++,n++)            {                strcpy(argv[n],argv[m]);            }	   argv[n]='\0';	//	char ** arg=argv+i+1;           int  argc1=argc-i-1;            close(pfd[1]);            close(0);            dup(pfd[0]);	    close(pfd[0]);            if(argv[0]!=NULL)            {                ppipe(argv,argc1);            }         }      }        i++;   }    execvp(argv[0],argv);  return 0;}int deal_com(char* argv[],int argc,char str[]){   int ptr=0;   int i=0;  ptr=del_space(ptr,str);  int outfile=-1;  int infile=-1;  int ispipe=-1;  while(str[ptr]!='\0')  {     argv[i]=(char*)malloc(sizeof(char)*30);     ptr=getone(argv[i],ptr,str);     if(strcmp(argv[i],">")==0)        outfile=i;     else if(strcmp(argv[i],"<")==0)        infile=i;     else if(strcmp(argv[i],"|")==0)        ispipe=i;     i++;     argc++;     ptr=del_space(ptr,str);   }   argv[i]='\0';   return argc; }int del_space(int ptr,char str[]){     while(str[ptr]==' ')        ptr++;     return ptr;}int getone(char* argv1,int ptr,char str[]){ //   printf("getone start\n");     char temp[20];     int i=0;     if(str[ptr]=='>'||str[ptr]=='<'||str[ptr]=='|')     {        temp[i++]=str[ptr++];     }     else     {       while((str[ptr]>='a'&&str[ptr]<='z')||(str[ptr]>='A'&&str[ptr]<='Z')    ||str[ptr]=='_'||str[ptr]=='-'||str[ptr]=='/'||str[ptr]=='.'||(str[ptr]>='0'&&str[ptr]<='9'))       {           temp[i++]=str[ptr++];       }     }           temp[i]='\0';           strcpy(argv1,temp);           return ptr;}int get_com(char str[]){  char c;  int i=0;  c=getchar();  while(c!='\n')  {    str[i]=c;    c=getchar();    i++;  }  str[i]='\0';   return 1;}void initial(char arg[COM_COUNT][COM_SIZE],char* argv[]){    int s=0,d=0;//    printf("initial\n");    for(s;s<COM_COUNT;s++)//每次调用命令之前对参数进行初始化...    {        for(d;d<COM_SIZE;d++)            arg[s][d]='\0';        argv[s]=NULL;     }}int inCommand(char* str,int& flag)//内部命令{  if(strcmp(str,"exit")==0)  {      flag=1;      return 1;  }  if(strcmp(str,"logout")==0)  {     flag=1;     return 1;  }   return 0;}/*void cd_com(char* argv[]){   int res=0;   if(argv[1]!=NULL)   {      res=chdir(argv[1]);   }   else      printf("Change dir error!\n");   if(res<0)      printf("Change dir error\n");   return;}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -