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

📄 main.c

📁 本软件模拟Shell 的命令解释程序
💻 C
字号:
#include "dshell.h"/************************************************************************/
/************************************************************************/
////////////////////////主函数////////////////////////

int main(int argc, char *argv[], char *env[])
{        printf("\n");
        printf("****************Welcome to use shell*****************\n");        printf("*****************************************************\n");        printf("You can input any order.you can input [exit] to leave. \n");        printf("*****************************************************\n");        printf("\n");        char*p;
	Cmd ExeCmd;
	Cmd* pSecCom = NULL;
	ExeCmd.argv=NULL;
	ExeCmd.argc=0;
	char buf[1024],tmp;
	char *pSecP = NULL;
	do
	{
		//当执行过的命令未释放删除时,释放删除
		if (ExeCmd.argv!=NULL)
		{
			for (; ExeCmd.argc>0; ExeCmd.argc--)
			{
				free(ExeCmd.argv[ExeCmd.argc-1]);
				ExeCmd.argv[ExeCmd.argc-1]=NULL;
			}
			free(ExeCmd.argv);
  	ExeCmd.argv=NULL;//置空				
  	}
        printf("\n");
        p=get_current_dir_name();
        printf("The current path is %s\n",p);
		printf("Please input the order:");//提示输入命令
		int i=0;
		//输入命令
		while((tmp=getchar())!='\n')
		{
			buf[i]=tmp;
			i++;
		}
		buf[i]='\0';
	
  
					pSecP = Pipe(buf);//判断是否有两个进程;若有,pSecP保存为第二个进程的地址,否则是null 
					
					if (pSecP!=NULL)//当存在管道处理时
					{
						char *ad=" >/";
						strcat(buf, ad);
						char *ad2=" </";
						strcat(pSecP, ad2);
					}
				  processComd(&ExeCmd, buf);	//解析用户输入命令 /* char*path; 
    path=(char*)malloc(sizeof(char)*30);
		if(strncmp(buf,"cd",2)==0)//当输入的命令为cd时,将路径保存在path中
    {           
       i=2;
       int j=0;
       while(buf[i]!='\0')
       {   
          if(buf[i]==' ')i++;
          else
          	 {                       
			          path[j]=buf[i];
			          //printf("[%c]\n",path[j]);
			          i++;
			          j++;
             }
        }  
        path[j]='\0';
 * /  
 
                if(strcmp(ExeCmd.argv[0], "cd")==0)
				{
        ExecuteCd(ExeCmd.argv[1]);//执行cd命令
        continue;//重新输入
        }
     //    ExecuteCd(path);//执行cd命令
    //    continue;//重新输入
         //      break;
                   
    // }
					if (i==0)//假如没有输入命令就重新输入
						continue;
			
			   findExec(&ExeCmd, buf);//查找执行文件
         int bg=isBackground(&ExeCmd);//是否需要设置后台
		     if (pSecP!=NULL)//有另一个进程
		     {
						pSecCom = (Cmd*)malloc(sizeof(Cmd));//存在管道,创建另一个进程
						pSecCom->argv=NULL;
						pSecCom->argc=0;
						processComd(pSecCom, pSecP);//解析命令
						findExec(pSecCom, pSecP);//查找执行文件
						bg=isBackground(pSecCom);//是否需要设置后台
	      	}
					int* pipeID = NULL;          
					if (strcmp(ExeCmd.argv[0], "exit")!=0)//用户输入的不是而exit命令
					{
						if (strcmp(buf, "")==0)//若用户没有输入命令
						{
							printf("Bad command or file name.\n");
							continue;
						}
					
						int npid;
						pipeID = CreatPipe(&ExeCmd);//建立管道
						if ((npid=fork())==0)//创建线程
						{
							errno=0;
							redirectInOut(&ExeCmd, pipeID);//输入输出重定向
							int status = execve(buf, ExeCmd.argv, env);//执行指令
							printf("Error executing specified file. (#%d)\n", errno);
							return 1;
						}
						else
						{
							if (pSecP==NULL)//如果只有一个进程
							{
								if (!bg)//如果需要并发执行
								{
									int status;
									wait(&status);//阻塞父进程,等待子进程结束
								}
								else
								{
									printf("Program ID#%d executed successful at background.\n", npid);
								}
							}
						}
						if (pSecP!=NULL)
						{
							if ((npid=fork())==0)
							{
								errno=0;
									/*重定向到管道*/
								redirectInOut(pSecCom, pipeID);
								int status = execve(pSecP, pSecCom->argv, env);
								printf("Error executing specified file. (#%d)\n", errno);
								return 1;
							}
							else
							{
								close(pipeID[0]);
								close(pipeID[1]);
								if (!bg)
								{
									int status;
									wait(&status);
								}
								else
								{
									printf("Program ID#%d executed successful at background.\n", npid);
								}
							}
						}
					}
					if (pSecP!=NULL)//释放空间
					{
						sleep(1);
						free(pipeID);
						pipeID=NULL;
						free(pSecP);
						pSecP=NULL;
						free(pSecCom);
						pSecCom=NULL;
					}
		
				}while(strcmp(ExeCmd.argv[0], "exit")!=0);
				
				if (ExeCmd.argv!=NULL)
				{
					for (; ExeCmd.argc>0; ExeCmd.argc--)
					{
						free(ExeCmd.argv[ExeCmd.argc-1]);
						ExeCmd.argv[ExeCmd.argc-1]=NULL;
					}
					free(ExeCmd.argv);
					ExeCmd.argv=NULL;
				}
				printf("Thank you ,see you next!\n");
				return 0;
}

⌨️ 快捷键说明

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