实现一个简单的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的运行原理,让我们有更加深刻的印象.