实现一个命令行解释器

1、初始化命令行解释器

在计算机系统中,操作系统内核是一个很大得到软件模块,用户不能直接去使用。因此计算机提供一个外壳shell,用户能够通过这个外壳执行各种应用程序,从而完成操作系统各种功能。

shell:命令解释器。允许用户交互式的输入命令并解释执行,并且可以调用出相应的应用程序运行,从而让用户能够使用内核的功能去操作计算机

如mac中的bash ,window中的cmd Linux中的shell

目标:设计一个命令行的shell应用程序,解释用户输入的命令并解释执行。

shell应用程序,内置一个命令表,包含可以被执行的若干指令。当命令不存在于命令表中,尝试从磁盘加载应用程序

2、实现help命令

以help命令,演示如何在shell中执行内置命令

如何解析命令字符串,按照int argv, char argv的方式

1)通过遍历内置命令表:command list 

2)help命令的实现包括获取用户输入,解析输入缓冲区中的字符,以及执行相应的命令

具体过程:

使用strchr函数查找特定字符位置,并将其设置为0,以清理输入字符

定义strtok函数,用于分割字符串、提取命令和参数

ARGV和ARGC用于传递参数和参数数量给命令执行函数

命令的查找与执行

通过查找命令表,找到用户输入的命令对应的函数指针

如果命令是内置命令,直接执行相应函数

如果命令在磁盘上,需要从磁盘加载并执行相应的子应用程序

命令的输入与解析

使用特定长度的输入函数fgets获取标准输入,避免数据量过大的问题

解析输入字符串,取出不必要的回车和换行字符,以便后续处理

利用strtok函数按照空格分割输出字符串,提取命令和参数

将提取出的参数字符串转为指针数组,传递给相应的内置命令执行函数

3、执行echo命令并给输出加颜色

加了信息输出时使用不同颜色的功能,以及演示了如何在程序中解析命令行的参数选项

显示颜色和清屏

两项功能是通过发送ESC转义序列完成,根本实现颜色的控制和清屏,只需要发送相应的转义序列。

命令选项的解析

使用getopt函数(Newlib提供)进行命令行的参数解析。

int getopt(int argc, char * const argv[],  const char *optstring); 

使用echo命令时,使用的形式为echo -n 重复数量 -h 待重复的字符串,其中有-n和-h为选项,且-n的后边必须加上一个数量值。

因此在调用getopt时,optstring需要设置为n:h(n后面的:表示n必须有几个参数值)

while ((ch = getopt(argc, argv, "n:h")) != -1) {}

在设置optstring后,每次调用时,getopt函数会逐个扫描argv相应的选项,如n或者h

如果返回的是期望的选项,如n或者h,我们可以从全局变量optarg中获取对应的值

如果返回的是?,则表示解析出的选项不可识别,例如echo -x,此时optopt的值将会被设置成x

当返回时-1时,表示已经没有参数,即对于echo -n 重复数量 -h 字符串,表示已经扫描完所有以-开头的选项,后续已经没有其它选项。

while ((ch = getopt(argc, argv, "n:h")) != -1) {switch (ch) {case 'h':puts("echo echo any message");puts("Usage: echo [-n count] msg");optind = 1;        // getopt需要多次调用,需要重置return 0;case 'n':count = atoi(optarg);break;case '?':if (optarg) {fprintf(stderr, "Unknown option: -%s\n", optarg);}optind = 1;        // getopt需要多次调用,需要重置return -1;}}

getopt被调用时,getopt会调整argv中各参数的顺序。因此当getopt优先返回-1时,optind指向了第一个非选项的参数的索引,即待重复的字符串在argv中索引号。因此,我们此时可以通过argv[optind]来获取待重复的字符串。

由于getopt将会在其它命令的执行时重复使用,因此需要在退出echo命令的执行时,将optind重置。因为optind 是 argv 中要处理的下一个元素的索引,该变量为全局变量,getopt会依赖此值。

3、为进程增加exit接口

在应用程序的执行过程中,程序可能会主动结束执行,或者从main返回,因此需要给进程一个主动退出执行的接口。应用程序通常以main函数开头,通过return语句退出函数,但也可以使用EXIT库函数退出。

exit系统调用的功能是允许进程在任意位置主动退出,结束执行,任何属于该进程的打开的文件描述符都会被关闭。因为exit已经有newlib库实现,我们只需要实现更底层的exit

exit系统调用接口实现:

  • 添加系统调用表配置项
  • sysy_exit系统调用的实现应停止进程执行,回收相关资源,内存
  • 进程退出前会关闭打开的文件,将状态信息保存到进程的task结构中
  • 应用程序返回时,应直接调用exit函数终止进程,且exit函数应包含应用程序的返回操作。

4、为进程增加wait接口

在shell加载程序运行时,需要程序的执行结果,因此需要调用wait来获取子程序的执行结果

int wait(int* status);

wait系统调用的功能:

  1. 回收子进程的所有资源
  2. 获取子进程的运行结果,如果调用的子进程还未结束,则会等待

僵尸进程(并未进行处理)

如果父进程没有主动调用wait来回收子进程的资源,则子进程会成为僵尸进程。

僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源

5、让子进程继承父进程已打开的文件

考虑到fork的功能是创建一个完全相同的子进程,因此需要将增加的打开文件进行复制。如果直接内存复制在进程间是不可行的,因为两个进程的状态是独立的

文件表的复制与引用计数

  • 文件表的复制通过遍历父进程的文件表并复制其内容
  • 引用计数用于跟踪文件的打开次数,确保多个进程访问时文件不会被意外关闭
  • 子进程创建时,需要增加被打开的文件的引用计数。

进程间文件访问冲突解决

  • 多个进程同时往控制台写数据时,需要解决写冲突。
  • 通过在写操作前加锁,确保一次只允许一个进程写入。
  • 锁机制保护了控制台写操作,避免了多个进程同时写入的冲突

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/413996.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51单片机——LED点阵屏

1、点阵屏简介 LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等 LED点阵屏分类 按颜色:单色、双色、全彩 …

【202408最新】Anaconda+VSCode+CUDA+Pytorch安装配置保姆级教程

最近新换了电脑,又开始从头配置代码环境,到处看教程真的一个头两个大,干脆自己整理了一下,方便以后一站式重装。也提供给大家参考。 1.Anaconda下载安装 Anaconda和Python是替代品(也不是),下…

浅析WebRTC技术在智慧园区视频管理场景中的应用

随着科技的飞速发展,智慧园区作为城市智慧化的重要组成部分,正逐步成为现代化管理的重要方向。智慧园区的建设不仅涉及硬件设施的智能化升级,还离不开高效的视频管理和实时通信技术。在这一背景下,WebRTC(Web Real-Tim…

兴业证券基于Apache DolphinScheduler的应用实践

文 / 兴业证券股份有限公司 刘洋 石良生 柳君 李致琪 本文来源于网络,如有侵权,请联系删除 任务调度平台,扮演着自动执行预设任务的重要角色,是业务开展过程中不可或缺的一环。随着业务规模的不断扩展,兴业证券每日…

【JavaWeb】Http请求与响应

文章目录 Http 请求与响应一、Http 请求格式1、请求行2、请求头3、请求体(post请求才有) 二、HttpServletRequest1、获取 请求行 信息2、获取 请求头 信息3、获取 请求参数 信息 三、Http 响应格式1、响应行2、响应头3、响应体(正文&#xff…

杨辉三角

题目 给定一个非负整数 numRows&#xff0c;生成杨辉三角的前 numRows 行。 在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。 示例: 输入: 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1] ]参考答案 class Solution { public:vector<vector<int>…

Centos 下载和 VM 虚拟机安装

1. Centos 下载 阿里云下载地址 centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 2. VM 中创建 Centos 虚拟机 2.1 先打开 VM 虚拟机&#xff0c;点击首页的创建新的虚拟机 2.2 选择自定义&#xff0c;然后点击下一步。 2.3 这里默认就好&#xff0c;继续选择下一…

JavaWeb学习——Maven高级使用学习

一、分模块设计与开发 1、分模块设计原因 Maven 的分模块设计主要有以下几个原因&#xff1a; 1. 模块化管理&#xff1a;在大型项目中&#xff0c;代码量通常会非常大&#xff0c;如果将所有的代码都放在一个模块中&#xff0c;会使得项目结构复杂&#xff0c;不利于代码的管…

大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【安全科普】学完网络安全出去能做什么工作?

想要了解学完网络安全工程师就业班后&#xff0c;出去能做什么工作&#xff0c;这个时候会分甲方或是乙方&#xff0c;看个人更偏向哪个岗位。 甲方指的是政府、海关、税务机构、高校及其他国有银行、商业银行&#xff0c;以及移动运营商&#xff08;如中国移动、中国联通、中…

【前缀和算法】--- 进阶题目赏析

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey 本篇我们来赏析前缀和算法的进阶题目。 &#x1f3e0; 和可被K整除的子数组 &#x1f4cc; 题目解析 和可被k整除的子数组 &#x1f4cc; …

线性回归算法详解

目录 线性回归算法 线性回归方程 误差项分析 似然函数求解 线性回归求解 梯度下降算法 下山方向选择 梯度下降优化 梯度下降策略对比 学习率对结果的影响 代码实现 线性回归算法 线性回归是回归算法中最简单、实用的算法之一&#xff0c;在机器学习中很多知识点都是…

【网络】数据链路层协议——以太网,ARP协议

目录 1.局域网转发 2.MAC地址 2.1.什么是MAC地址 2.2.Mac地址的作用 2.3.MAC地址和IP地址的区别和联系 3.以太网协议 4.MTU&#xff0c;IP MTU&#xff0c;MSS 4.1.MTU 4.2. IP MTU 4.3. MSS 4.4. 区别及联系 5.局域网的数据碰撞 5.1.局域网内通信过程 5.2.数据碰…

宏集MIRO-L230工业路由器: 一站式全球联网解决方案

在日益互联的世界中&#xff0c;全球覆盖的稳定连接已成为业务成功的关键因素。宏集非常高兴地向您介绍我们的最新创新产品——MIRO-L230工业路由器&#xff0c;这是一款为现代企业量身定制的LTE路由器&#xff0c;为用户带来前所未有的稳定连接体验。 宏集MIRO-L230工业路由器…

墨兰:花语寓意、神秘传说与独特魅力全解析

在繁花似锦的植物世界中&#xff0c;墨兰宛如一位优雅的隐士&#xff0c;静静地散发着独特的魅力。它那婀娜的身姿和淡雅的芬芳&#xff0c;仿佛在诉说着一个个古老而神秘的故事。当我们凝视着墨兰&#xff0c;不禁会被它那独特的气质所吸引&#xff0c;想要探寻它背后隐藏的花…

电容的分类

电容作为电子产品中不可或缺的元件&#xff0c;其种类繁多&#xff0c;各具特色。以下是电容的主要分类、作用及优缺点概述&#xff1a; 一、电容的分类 电容的分类方式多样&#xff0c;常见的分类方式包括按结构、用途、电解质类型及制造材料等。 按结构分类&#xff1a; 固…

C++编程-递归算法1

目录 先言 关于递归算法 例题一 题目描述 算法分析 标准程序 代码分析 例题二 题目描述 算法分析 标准程序 例题三 题目描述 算法分析 标准程序 代码分析 例题四 题目描述 标准程序 代码分析 后言 先言 从今天开始&#xff0c;我们将新的算法——递归&…

大二必做项目贪吃蛇超详解之中篇游戏设计与分析

贪吃蛇系列文章 上篇win32 中篇设计与分析 文章目录 贪吃蛇系列文章1. 地图1. 1 <locale.h>本地化1. 2 类项1. 3 setlocale函数1. 4 宽字符的打印1. 5 地图坐标 2. 蛇身和食物3. 数据结构设计4. 游戏流程设计5. 核心逻辑实现分析5. 1 游戏主逻辑5. 2 GameStart5. 2. 1 S…

145. 利用 Redis Bitmap实践: 用户签到统计

文章目录 一、Redis Bitmap简介二、Bitmap 的主要应用三、Go使用Redis实现签到统计用户签到查询用户签到状态统计今年累计签到天数统计当月的签到情况 总结 在现代应用程序中&#xff0c;用户签到是一个常见的功能。我们通常使用 MySQL 数据库来存储用户的签到记录。然而&#…

Go入门:gin框架极速搭建图书管理系统

Go入门:gin框架极速搭建图书管理系统 前言 本项目适合 Golang 初学者,通过简单的项目实践来加深对 Golang 的基本语法和 Web 开发的理解。 项目源码请私信,欢迎前往博主博客torna.top免费查看。 项目结构 D:. ├─ go.mod ├─ go.sum │ ├─ cmd │ └─ main │ …