**编写思路:**对输入的命令先进行字符串解析,将字符串分成一个一个的,然后创建子进程,在调用进程替换函数执行输入字符串的命令。
//本程序实现一个基本的minihell程序
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include <sys/wait.h>
#include <ctype.h>
int main()
{
while(1)
{
printf("[cq@localhost]$ ");
fflush(stdout);
char tmp[1024] = {0};
scanf("%[^\n]%*c",tmp);
printf("[%s]\n",tmp);
//"ls -a -l" ->"ls" "-a" "-l"
char *argv[32] = {NULL};
int argc = 0;
char *ptr = NULL;
ptr = tmp;
while(*ptr !='\0')
{
if(!isspace(*ptr))
{
argv[argc] = ptr;
argc++;
while(!isspace(*ptr) && *ptr != '\0') ptr++;
*ptr = '\0';
ptr++;
continue;
}
ptr++;
}
// int i;
// for(i = 0;i < argc;i++ )
// {
//printf("argv[%d] = [%s]\n",i,argv[i]);
// }
argv[argc] = NULL;
//判断当前命令是否是内建命令
if(!strcmp(argv[0],"cd"))
{
chdir(argv[1]);
continue;
}
int pid = fork();
if(pid == 0)
{
//execlp(tmp,tmp,NULL);
execvp(argv[0],argv);
//若子进程程序替换失败,则直接退出,应为==因为终端不需要多个shell
exit(0);
}
//等待子进程退出
wait(NULL);
}
return 0;
}
运行结果: