【Linux】模拟实现简易shell程序

shell是一个命令行解释器,但很多人并不能很好地去理解它,但如果你能看懂这个简易的shell实现,问题就迎刃而解。

1.shell是一个命令行解释器。
2.它是一个程序,用来捕捉命令,并不会执行
3.shell是用户能和内核更好了交流的程序

  1 #include<stdio.h>                                                                                                                                                                                                                                                                    
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 #include<sys/wait.h>
  5 #include<string.h>
  6 int main(){
    
    
  7   while(1){
    
    
  8   printf("[user@localhost path]$ ");
  9   fflush(stdout);
 10   //这里不能用换行刷新缓冲区,否则输入就另起一行
 11   char scan[1024]={
    
    0};
 12   fgets(scan,1024,stdin);
 13   //这一步一定要-1,因为输入的时候会输入一个回车,这一步把回车替换
 14   scan[strlen(scan)-1]='\0';
 15 
 16   char* idx=scan;
 17   char* myagv[10]={
    
    NULL};
 18   int myagc=0;
 19   while(*idx!='\0'){
    
    
 20     if(*idx!=' '){
    
    
 21       myagv[myagc]=idx;
 22       ++myagc;
 23       while(*idx!='\0'&&*idx!=' '){
    
    
 24         ++idx;
 25       }
 26       *idx='\0';
 27       ++idx;
 28     }
 29     myagv[myagc]=NULL;
 30   }
 31 
 32   //cd命令是shell本身实现
 33   if(strcmp("cd",myagv[0])==0){
    
    
 34     chdir(myagv[1]);//chdir系统调用接口实现切换目录
 35     continue;
 36   }
 37 
 38   //开始创建进程
 39   pid_t pid=fork();
 40   if(pid<0){
    
    
 41     perror("make error");
 42   }
 43   if(pid==0){
    
    
 44     execvp(myagv[0],myagv);
 45     //用myagv指针数组来存输入内容,选execvp
 46     perror("error");
 47     exit(-1);
 48   }
 49   waitpid(-1,NULL,0);//进程等待
 50 
 51 
 52 }
 53 return 0;
 54 }

在这里插入图片描述
在这里插入图片描述

我们可以看到minishell帮我们实现了进程的创建,替换等待和退出,这就是shell工作的模式,当然,实际的shell更加复杂和多功能,希望对你有帮助。

猜你喜欢

转载自blog.csdn.net/zhaocx111222333/article/details/115163550
今日推荐