怎样自己实现一个shell?(干货!!!)一定要学会!!!基本原理!!!

在这里插入图片描述

目录:

shell的概念

在这里插入图片描述

这里我们就要对shell简单的理解一下:
在这里插入图片描述
shell就是起到让用户对于内核中的内容操作的更加方便的作用!

今天我们就要实现一个简单的shell,也就是打印出一个对应的用户,我们对其内部进行操作
在这里插入图片描述

shell的实现思路讲解

我们今天再这里实现的shell就是一个比较简单的命令行解释器,它所操作的也是内核!

1.首先我们在操作Linux的时候,就是要在键盘中输入对应的指令

在这里插入图片描述

2.解析输入信息-命令名称.运行参数

因为这一步比较重要,所以我进行分步骤来描写
1)将我们输入的字符串进行取出
2)然后对每个单独的指令进行处理

在这里插入图片描述

3.创建一个子进程 fork

我们要创建一个子进程;来对于输入的操作来进行处理,这样就可以维护我们的父进程,不会退出

要求:
----- 让子进程执行对应的命令程序
----- 子进程打开失败必须退出,成功运行完命令程序会自己退出

4.等待子进程退出 wait

在子进程运行的时候进行等待,防止出现僵尸进程,使程序无法继续.

代码实现/具体讲解

#include <stdio.h>		//因为我们是通过C语言进行编写,包含的头文件比较多
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>



int main(int argc, char *argv[]){

//========================解析输入的数据===========================
    while(1) {		//首先将其用户名包含在循环里面,在每一步都要出现
        printf("[user@host path]$ ");		//简单描写的用户名
        fflush(stdout);						//刷新缓冲区,每一步都可以刷新出来
        char buf[1024] = {0};				//定义一个足够大的字符串
        fgets(buf, 1023, stdin);			//将对应的数据输入进来
        buf[strlen(buf) - 1] = '\0';		//对字符串的最后写入\0,表示一个字符串的结束

        
//========================对输入的数据进行处理======================
        int myargc = 0;
        char *ptr = buf, *myargv[32] = {NULL};	//定义一个指针,对我们输入的每个数据进行指向
        while(*ptr != '\0') {		//在这个字符串没有结束继续操作
            if (*ptr != ' ') {		//如果某一个字符不是空格的时候
                myargv[myargc] = ptr;	//将其存放在这个数组指针里面
                myargc++;				//然后myargc向后取到下一个数组指针
          
                while(*ptr != '\0' && *ptr != ' ') ptr++;	
                //遍历到一个字符命令的结尾的时候,让其跳到下一个位置,对于上面这个位置写入\0,
                //就将这个单个的命令提取了出来,存放在指针数组的第一个位置.
                *ptr = '\0';
            }
            ptr++;	//偏移到下一个位置开始存放下一个数据
        }
        myargv[myargc] = NULL;	//将被存放完的下一位指针设为空,标准结局

        // cd /home
        if (strcmp("cd", myargv[0]) == 0) {	//当出现cd的时候,这里是字符串的比较,strcmp函数,相同则为0
            chdir(myargv[1]);	//直接跳到cd 后面所传输进行目录里面/调用了函数
            continue;		//循环继续
        }
  
        
//===========================创建子进程进行编写=====================
        pid_t pid = fork();		//创建一个子进程
        if (pid < 0) {		//子进程创建失败,返回错误原因
            perror("fork error");
            continue;	//继续
        }else if (pid == 0) {		//当创建成功的时候
            execvp(myargv[0], myargv);		//使用execvp进行程序替换,直接转到要执行的程序中
            perror("execvp error");		//当程序替换失败才会到这一步,直接返回错误原因
            exit(-1);		//进行错误码退出
        }
    
        
//============================父进程进行等待========================
        wait(NULL);		//让父进程进行等待,子进程运行结束再运行父进程,防止僵尸进程的产生
    }
    return 0;
}

直到这里我们就可以简单的实现一个shell了,大家多敲几遍代码,看清楚我写的每一步注释,就能学会这里了,我们自己写的这个shell主要还是能让我们更加熟练地掌握shell的运行原理,让我们有更加深刻的印象.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值