实现步骤:
1.获取命令行
2.解析命令行
3.创建一个子进程
4.替换子进程
5.父进程等待回收子进程
实现:
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
void do_shell(int argc,char * argv[]){
pid_t pid =fork();
if(pid == -1) perror("fork"),exit(1);
if(pid==0){ //子进程负责替换进程
if(execvp(argv[0],argv)==-1)
perror("execvp"),exit(1);
}
else if(pid > 0){
wait(NULL); //父进程等待回收子进程
}
}
void do_parse(char *buf){
int i=0;
int argc=0;
char * argv[8];
int status=0;
for(i;buf[i];i++){
if(!isspace(buf[i])&&status==0){
argv[argc++]=&buf[i];
status=1;
}
else if(isspace(buf[i])){
status=0;
buf[i]=0;
}
}
argv[argc]=NULL;
do_shell(argc,argv);
}
int main(void){
char buf[1024]={};
while(1){
memset(buf,0x00,sizeof(buf));
printf("[adi@localhost] >");
scanf("%[^\n]%*c",buf); //获取命令行
if(strncmp(buf,"exit",4)==0)
exit(0);
do_parse(buf);//解析命令行函数
}
}
运行结果:
此款shell为简易款,只能实现一些简单的查看命令,仍有许多要改进的地方。。。
缺点:
1)不能使用删除键更新书写错误
2)内部命令无法实现