📄 main.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 + -