操作系统——实现一个简单的 shell 命令行解释器

news2024/10/7 14:33:18

一:实验题目

实现一个简单的 shell 命令行解释器

二:实验目的

本实验主要目的在于进一步学会如何在 Linux 系统下使用进程相关的系统调用,了解 shell 工作

的基本原理,自己动手为 Linux 操作系统设计一个命令接口。

三:总体设计(含背景知识或基本原理与算法、模块介绍、设计步骤等)

要设计的 shell 类似于 sh,bash,csh 等,必须支持以下内部命令:

cd <目录>更改当前的工作目录到另一个<目录>。如果<目录>未指定,输出当前工作目录。如

果<目录>不存在,应当有适当的错误信息提示。这个命令应该也能改变 PWD 的环境变量。

environ 列出所有环境变量字符串的设置(类似于 Linux 系统下的 env 命令)。

echo <内容 > 显示 echo 后的内容且换行

help 简短概要的输出你的 shell 的使用方法和基本功能。

jobs 输出 shell 当前的一系列子进程,必须提供子进程的命名和 PID 号。

quit,exit,bye 退出 shell。

背景知识和基本原理:

Shell 是一种命令行解释器,它提供了用户与操作系统之间的交互界面。Shell 接收用户输入的命令,解释并执行这些命令,然后将结果返回给用户。Shell 在操作系统中起到了承上启下的作用,它可以调用系统的各种功能和服务,同时也是用户与操作系统进行交互的窗口。

设计步骤:

1.读取用户输入的命令行。

2.解析命令行,将命令和参数分离,并进行相应的语法检查。

3.根据解析后的命令,执行相应的操作。这可以是调用系统内置命令,执行外部程序,或者执行一系列其他操作。

4.处理命令执行的结果,并将结果输出给用户。

5.循环执行上述步骤,直到用户选择退出。

具体模块介绍:

输入模块:负责读取用户输入的命令行。

解析模块:负责解析命令行,将命令和参数分离,并进行语法检查。

执行模块:根据解析后的命令,执行相应的操作。这可能涉及调用系统内置命令、执行外部程序等。

输出模块:处理命令执行的结果,并将结果输出给用户。

主控模块:循环执行上述模块,控制整个命令行解释器的流程。

设计步骤:

*设计数据结构,如命令结构体、参数列表等。

*实现输入模块,读取用户输入的命令行。

*实现解析模块,将命令行解析成命令和参数,并进行语法检查。

*实现执行模块,根据解析后的命令执行相应的操作。

*实现输出模块,处理命令执行的结果并将结果输出给用户。

*实现主控模块,循环执行输入、解析、执行和输出模块,控制整个命令行解释器的流程。

*进行测试和调试,确保命令行解释器能够正常运行。

*根据需要进行优化和改进,增加额外的功能或特性。

通过以上步骤,就可以实现一个简单的 shell 命令行解释器。在实际运行中,用户可以输入各种命令,如查看文件、创建目录、执行程序等,解释器将会解析并执行这些命令,并将执行结果返回给用户。

四:详细设计(含主要的数据结构、程序流程图、关键代码等)

主要代码:

char cmd[2100];

    while(1)

    {

        printf("请输入操作:");

        scanf("%s",cmd);

        int len=strlen(cmd),i;

        if(cmd[0] == 'e' && cmd[1] == 'c') // echo

        {

            int flag=0;

            for( i=5; i<len-1; i++)

            {

                if(cmd[i]!=' ') flag=1;

                if(flag)

                {

                    putchar(cmd[i]);

                }

            }

            if(flag) putchar('\n');

        }

        else if(cmd[0]=='q' || cmd[1]=='x' || cmd[0]=='b') // quit,exit,bye

        {

            printf("Bye\n");

            return 0;

        }

        else if(cmd[0]=='h') // help

        {

            printf("/**********************************/\n");

            printf("echo <content>\tprint a line content\n");

            printf("quit,exit,bye\tend produce\n");

            printf("cd <catalog>\techo catalog\n");

            printf("jobs\techo process name and pid...\n");

            printf("environ\techo environment variable\n");

            printf("/**********************************/\n");

        }

        else

        {

            char cata[100];

            int cnt=0;

            if(cmd[0]=='c') // cd

            {

                int flag=0;

                for( i=3; i<len; i++)

                {

                    if(cmd[i]!=' ') flag=1;

                    if(flag)

                    {

                        cata[cnt++] = cmd[i];

                    }

                }

                if(cnt==0)

                {

                    cata[0]='.';

                    cata[1]='\0';

                }

            }

            /* fork a child process */

            pid_t pid = fork();

            if (pid < 0)

            {

                /* error occurred */

                fprintf(stderr, "Fork Failed");

                return 1;

            }

            else if(pid==0)

            {

                if(cmd[0]=='c') // cd

                {

                    execlp("/bin/ls",cata,NULL);

                }

                else if(cmd[0]=='j') // jobs

                {

                    execlp("pstree","-p",NULL);

                }

                else if(cmd[0]=='e') // environ

                {

                    execlp("env","",NULL);

                }

            }

            else

            {

                /* wait wait,until child process exit*/

                wait();}

        }

        printf("\n");

    }

return 0;

五:实验结果与分析

这段代码是一个简单的命令行解释器程序,它接受用户输入的命令并执行相应的操作。以下是对代码进行实验的结果和分析:

 

 

程序的主循环使用一个无限循环,可以持续地接收用户输入并处理命令。

当用户输入以"ec"开头的命令时,程序会将除去前面的部分(即"ec"之后的内容)的内容打印出来。这个功能类似于echo命令,可以在屏幕上显示输入的内容。

当用户输入以"q"、"x"或"b"开头的命令时,程序会打印"Bye"并退出。

当用户输入以"h"开头的命令时,程序会打印一系列帮助信息,包括可用命令的说明。

对于其他以字母"c"开头的命令,程序会创建一个子进程来执行相应的操作。具体操作根据命令的不同而有所不同:

如果命令以"cd"开头,则子进程将调用execlp函数来执行/bin/ls命令,以显示指定目录的内容。

如果命令以"j"开头,则子进程将调用execlp函数来执行pstree -p命令,以显示进程树和相关进程的信息。

如果命令以"e"开头,则子进程将调用execlp函数来执行env命令,以显示环境变量的信息。

父进程会等待子进程执行完毕,然后继续下一个循环。

综上所述,这段代码是一个简单的命令行解释器,它具有基本的功能,但也存在一些改进的空间和潜在的问题。实际的实验结果和分析将取决于您在运行代码时输入的具体命令和操作。

六、小结与心得体会

这段代码是一个基本的命令行解释器程序,实现了一些常见的命令操作,如打印内容、退出程序、显示帮助信息、执行系统命令等。

1.代码使用了循环结构,使程序能够持续地接收用户输入并处理命令,增强了交互性。

2.子进程的创建和执行使用了fork和execlp函数,充分利用了操作系统提供的进程管理和执行外部命令的功能。

3.代码中的一些功能存在潜在问题,如输入验证和边界检查不完善,子进程创建和等待的处理方式可以更稳健。这些问题可以通过改进代码来解决,提高程序的健壮性和安全性。

4.在实验过程中,可以尝试不同的命令和参数来测试程序的功能和正确性,观察程序的输出和行为是否符合预期。

5.这段代码为我们提供了一个基本的框架,可以根据需要进一步扩展和改进,添加更多功能和命令,以满足实际需求。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebSocket是什么,怎么用

74. WebSocket是什么&#xff0c;怎么用 当涉及到实时通信和即时更新的需求时&#xff0c;WebSocket 是一种强大且常用的解决方案。 1. 什么是 WebSocket&#xff1f; WebSocket 是一种在客户端和服务器之间实现双向通信的协议。它允许服务器主动向客户端推送数据&#xff0…

在Mac上安装Aspectj1.9.8(用于Java17)

1. 确定所使用的Java版本和AspectJ的对应关系 2. 下载AspectJ包 3. 安装AspectJ 4. 添加AspectJ对应的环境变量 5. 测试AspectJ 5.1 简单命令行测试安装是否成功 5.2 在IDEA中添加对AspectJ的支持【todo】 5.3 敲测试代码并进行测试【todo】 -----------------------------…

如何将window文件夹挂载到VMware系统mnt目录

背景&#xff1a;项目开发过程中&#xff0c;通常是在Windows上编码&#xff0c;有些框架和软件只能够在Linux上面执行&#xff0c;如果在 VMware中的Linux上面开发不太方便&#xff0c;因此需要在Windows上面开发好再同步到Linux上面运行。 软件&#xff1a; Samba客户端 V…

nodejs安装及环境变量配置(修改全局安装依赖工具包和缓存文件夹及npm镜像源)

本机环境&#xff1a;win11家庭中文版 一、官网下载 二、安装 三、查看nodejs及npm版本号 1、查看node版本号 node -v 2、查看NPM版本号&#xff08;安装nodejs时已自动安装npm&#xff09; npm -v 四、配置npm全局下载工具包和缓存目录 1、查看安装目录 在本目录下创建no…

抓包技术的应用示例

前言 最近瑞幸在搞活动&#xff0c;每天免费送10000份咖啡&#xff0c;我是个不喝咖啡的人儿&#xff0c;所以没咋关注&#xff0c;今早我们的团宠小妹&#xff0c;拉着我 10点整拼手速&#xff0c;想着帮她抢一杯&#xff0c;于是点开瑞幸咖啡小程序主页&#xff0c;banner 栏…

数学建模常用算法之主成分分析

数学建模常用算法之主成分分析 引言步骤实例以及代码 引言 主成分分析是一种降维算法&#xff0c;它能将多个指标转换为少数几个主成分&#xff0c;这些主成分是原始变量的线性组合&#xff0c;且彼此之间互不相关&#xff0c;且能反映出原始数据的大部分信息。 一般来说&#…

机器学习笔记 - vision transformer(ViT)简述

一、ViT简述 视觉转换器 vision_transformer(ViT) 因其令人印象深刻的准确率和计算效率而迅速成为卷积神经网络 (CNN) 在计算机视觉任务中的首选替代品。ViT模型在许多数据集和任务组合中的表现比CNN高出近4倍,从而确立了自己作为非常强大的竞争者的地位。 同样,基于转换…

采样中断服务程序原理

采样中断服务程序框图如图2&#xff0d;6所示。采样中断服务程序主要包括采样计算&#xff0c;TV、TA断线自检和保护起动元件三个部分。同时还可以根据不同的保护特点&#xff0c;增加一些检测被保护系统状态的程序。 一、采样计算概述 进入采样中断服务程序&#xff0c;首先进…

抖音林客服务商入驻申请

抖音林客服务商后台提供了以下主要功能&#xff1a; 数据报告&#xff1a;可以查看账户的广告投放、效果等数据报告&#xff0c;并进行数据分析和优化。 广告投放平台&#xff1a;可以创建和管理广告投放计划、定向和出价等设置&#xff0c;以及监控广告投放效果。 …

【032】C++高级开发之继承机制详解(最全讲解)

C的继承机制详解 引言一、继承和派生1.1、继承的概念和意义1.2、派生类的定义 二、继承中的构造和析构2.1、子类的构造和析构顺序2.2、子类调用成员对象、父类的有参构造 三、子类和父类的同名处理3.1、子类和父类同名成员数据3.2、子类和父类同名成员函数3.3、子类重定义父类的…

2.5C++多重继承

C 多重继承概述 C中的多重继承是指一个派生类可以从多个基类中继承属性和方法。 多重继承的作用是让 C 中的类更灵活地组合&#xff0c;以及实现代码的高复用。 多重继承的语法如下&#xff1a; access_specifier可以是public、protected或private&#xff0c;用来指定继承…

python学习——文本数据处理

目录 1 计算长度 len2 大小写 lower、upper、title、capitalize、swapcase3 字符检索 get、slice4 元素提取 findall、extract5 索引操作 find、index6 字符类型判断,结果一定是True或False7 字符判断 contains、startswith、endswith8 替换 replace9 字符的分割 split、partit…

鸿蒙HarmonyOS开发环境初识及搭建

一 鸿蒙简介 HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上&#xff0c;HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备&#xff0c;提供…

A Sequence-to-Set Network for Nested Named Entity Recognition

原文链接&#xff1a; https://www.ijcai.org/proceedings/2021/0542.pdf IJCAI 2021 介绍 问题 将嵌套NER视为span分类任务存在两个缺陷&#xff0c;不仅搜索空间大还缺少了实体之间的交互。 IDEA 因此作者提出了sequence-to-set的模型&#xff0c;不再提前给定span&#x…

【数据分享】全国县市2000-2021年农业、工业数据(免费获取)

《中国县域统计年鉴》是一部全面反映我国县域社会经济发展状况的资料性年鉴&#xff0c;收录了上一年度全国2000多个县域单位的基本情况、综合经济、农业、工业、教育、卫生、社会保障等方面的资料。 之前基于《中国县域统计年鉴》我们分享了2000至2021年的综合经济数据&#…

详解eslint在vue中如何使用

ESLint在vue中的使用 阅读目录 .editorconfig文件&#xff08;主要用于配置IDE&#xff09;.eslintignore文件&#xff08;放置需要ESLint忽略的文件&#xff0c;只对.js文件有效&#xff09;.eslintrc.js 文件(用来配置ESLint的检查规则) ESLint的用途 1.审查代码是否符合编…

SwinTransformer与Vit细节总结

建议通过标题来快速跳转 Vit (Vision Transformer) Vit把图片打成了patch&#xff0c;然后过标准的TransformerEncoder&#xff0c;最后用CLS token来做分类 Vit的位置编码 作者在文中试了几种方式&#xff0c;发现这几种在分类上效果差不多 1-dimensional positional emb…

EMQ 明道云:零代码高效构建工业物联网设备管理平台

背景 智能物联网设备在 IIoT 场景中有着广泛的应用&#xff0c;但如何管理和监控这些设备是一个挑战。 明道云是一家专业的 hpaPaaS 平台服务商&#xff0c;其所开发的明道云平台&#xff08;Mingdao Cloud&#xff09;是一个企业软件设计和开发工具&#xff0c;让企业可以低…

[230608] 阅读TPO58汇总|7:30-9:00+17:05

目录 ​​​​​​​ TPO58 1 The Development of Instrumental Music [3]修辞目的题 举例说明的作用 [9]句子插入题 [10]小结题 2 Pinyon Pines and Pinyon Jays [4]否定事实信息题 [5]修辞目的题 段落在全篇的作用 [10]小结题 3 The Rise of Classic Maya Civi…

SecCertificate 解析

一、SecCertificate A digital certificate is a collection of data used to securely distribute the public half of a public/private key pair. 数字证书 1. 结构 2. 读取和存储 2.1 Identity var certificate: SecCertificate? let status SecIdentityCopyCertific…