实现自己的shell

学习目标:

了解什么事shell并实现简单的shell的功能


目录

         一、shell概念:

二、实现shell思路:

         三、学习产出:

        1.代码实现

        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的原理,加深我们的印象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值