学习目标:
了解什么事shell并实现简单的shell的功能
目录
2.效果展示
一、shell概念:
shell本意是指壳,在计算机术语中,shell是指用户操作接口的意思。操作系统运行起来后都会给用户提供一个操作接口,这个操作接口就叫shell。
用户可以通过shell来调用操作系统内部的复杂实现。
————————————————
二、实现shell思路:
1、我们在操作Linux系统时,就是要在键盘中输入对应的指令。
2、解析输入的指令,命令名称-命令参数(以ls为例):
1)从最开始的字符开始遍历,第一个不为空格的字符。
2)往后遍历每一个字符,将ls遍历完整。
3)当遇到空格是,将空格转换为‘\0’,结束写入,就将ls提取出来。
4)接着往后遍历,提取命令参数,直至将输入的字符遍历完。得到我们需要的字符串,单独存放。例:{ls},{-l}。
3、创建子进程(fork)。
4、等待子程序退出(wait),防止出现僵尸进程,导致程序无法进行。
三、学习产出:
1.代码实现
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <pwd.h>
//读取键盘输入的字符
//将读到的字符进行分隔,遇到空格转换为 \0
int main()
{
while(1)
{
//获取当前用户名
struct passwd *pwd = getpwuid(getuid());
//获取当前路径
char buf[100] = {0};
getcwd(buf,100);
//打印用户名以及当前路径,并设置用户名、路径的颜色与高亮
printf("\033[32;1m%s@ubuntu:\033[0m\033[34;1m~%s$ \033[0m",pwd->pw_name,buf);
//定义字符串存储输入的信息
char arr[100] = {0};
//将信息输入到arr中
fgets(arr, 99, stdin);
//将最后一个字符改为\0(将回车改为\0表示字符串结束)
arr[strlen(arr) - 1] = '\0';
//处理字符串//
int i = 0;
char *argv = arr;
char *str[100] = {NULL};
if(strlen(arr) == 0 || 0 == strcmp("\n",arr))
{
continue;
}
while(*argv != '\0') //字符串没有结束之前一直循环
{
if(*argv != ' ') //字符不是空格时
{
str[i] = argv; //将字符写入str中
i++;
//当前字符不是空格并且字符串未结束遍历下一字符
//当字符为空格时,将该字符转换为结束符'\0'(字符命令结束)
//开始下一个字符
while(*argv != '\0' && *argv != ' ')
{
argv++;
}
*argv = '\0';
}
argv++;
}
//将下一指针设置为空
str[i] = NULL;
//当出现cd的时候,这里是字符串的比较,strcmp函数,相同则为0
if (strcmp("cd", str[0]) == 0)
{
//调用chdir函数跳转到cd后面的路径
chdir(str[1]);
continue;
}
//创建子程序//
pid_t pid = fork();
//创建失败
if(pid < 0)
{
perror("error");
return -1;
}
//创建成功
else if(0 == pid)
{
//使用cxecvp进行替换,转到需要执行的程序中
execvp(str[0], str);
perror("error");
exit(-1);
}
wait(NULL);
}
return 0;
}
2.效果展示
.
经过我们自己动手实现了简单的shell功能,让我们更加深刻的了解了shell的原理,加深我们的印象。