Linux 命令解释程序(shell)的模拟实现

1.实验内容

分析、设计与实现基于 Linux 内核的命令解释程序(Shell),主要包括系统环境变量的设置和初始化、系统命令提示符显示、命令辨别解析(区分内部命令与外部命令及不同内部命令)、典型内部命令(譬如显示指定目录下文件列表、显示文本文件内容、文件拷贝、文件删除、空文件创建、日期设置/显示)处理等功能,并在 Linux 操作系统上测试验证。

2.程序设计思路

  1. 设计命令列表,这个shell实现了"ls", "cd", "env", "ps", "date", "echo", "help", "exit"八个命令:  ls -查看当前目录内容

            cd [] -前往指定目录

            env -查看环境变量

            ps -查看当前进程

            date -查看当前的时间

            echo [] -显示指定的内容后换行

            help -帮助

            exit -退出

  1. shell的输入口实现,设计用户名和获取当前路径
  2. while循环获取用户输入的命令,在命令列表中则进入对应的命令执行部分,部分通过系统调用实现,命令无效发出报错。
  3. 对于和终端中一致的命令C++可以直接调用 execlp 系统调用的方式来实现
  4. 程序使用父子进程来实现并行执行命令和避免阻塞。当用户输入的命令是 "ls"、"env" 、 "ps" 等命令时,父进程会创建一个子进程来执行相应的命令。子进程通过调用 execlp 函数来执行外部命令。程序不会在执行 execlp 函数期间停止等待,这样可以在命令执行期间进行其他操作。
  5. 设计了一个help列表来展示所有的命令和功能

3.完整程序 

#include <iostream>  
#include <string>  
#include <vector>  
#include <sys/types.h>  
#include <sys/wait.h>  
using namespace std;  int main() {  vector<string> cmds={"ls", "cd", "env", "ps", "date", "echo", "help", "exit"};  string fp;  while(1) {  string now = "ljj@shell:" + string(getcwd(nullptr, 0)) + "> ";  printf("%s", now.c_str());  string cmd;  cin >> cmd;  string p;  bool valid = false;  int index = -1;  for (int i = 0; i < cmds.size(); i++) {  if (cmd == cmds[i]) {  valid = true;  index = i;  }  }  if (!valid) {  printf("No command! Input -help for more information\n");  continue;  }  else {  if(index < 5) {  // 使用父子进程使得程序可以同时执行多个命令并防止阻塞  pid_t pid;  pid = fork();  if (pid < 0) {  fprintf(stderr, "Fork Failed");  return 1;  }  else if (pid == 0) {  if(index == 0) { //ls  execlp("/bin/ls", "ls", NULL);  }  else if(index == 1) { //cd  cin >> p;  chdir(p.c_str());  }  else if(index == 2) { //env  execlp("env", "", NULL);  }  else if(index == 3) { //ps  execlp("ps", "", NULL);  }  else if(index == 4) { //time  execlp("date", "", NULL);  }  }  else {  waitpid(pid, NULL, 0);  }  }  else {  if(index == 5) { //echo  cin >> p;  cout << p << endl;  }  else if(index == 6) { //help  printf("Shell Commands List:\n\  ls -查看当前目录内容\n\  cd [] -前往指定目录\n\  env -查看环境变量\n\  ps -查看当前进程\n\  date -查看当前的时间\n\  echo [] -显示指定的内容后换行\n\  help -帮助\n\  exit -退出\n");  }  else return 0; // exit  }  }  }  return 0;  
}  

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

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

相关文章

写点东西《Docker入门(上)》

写点东西《Docker入门&#xff08;上&#xff09;》 环境变量 Docker 镜像 Docker CMD 与 ENTRYPOINT 有什么区别 Docker 中的网络&#xff1a; Docker 存储&#xff1a; Docker 是一个工具&#xff0c;允许开发人员将他们的应用程序及其所有依赖项打包到一个容器中。然后&…

【Redis】Redis 进阶

文章目录 1. BigKey1.1 MoreKey1.2 BigKey 2. 缓存双写一致性更新策略2.1 读缓存数据2.2 数据库和缓存一致性的更新策略2.3 canal 实现双写一致性 3. 进阶应用3.1 统计应用3.2 hyperloglog3.3 GEO3.4 bitmap 4. 布隆过滤器5. Redis 经典问题5.1 缓存预热5.2 缓存穿透5.3 缓存击…

Android Persistent自启机制

1.persistent属性的使用 在开发系统级的App时&#xff0c;很有可能就会用persistent属性。当在AndroidManifest.xml中将persistent属性设置为true时&#xff0c;那么该App就会具有如下两个特性&#xff1a; 在系统刚起来的时候&#xff0c;该App也会被启动起来 该App被强制杀…

华为完全自研之后,中国的手机会变得更便宜好用吗?

华为完全自研之后&#xff0c;中国的手机是否会变得更便宜好用&#xff0c;这是一个复杂的问题&#xff0c;涉及到多个因素。 首先&#xff0c;华为完全自研意味着公司需要自主研发和生产手机的所有组件&#xff0c;包括处理器、摄像头、屏幕等。这将有助于降低成本&#xff0c…

antd时间选择器,设置显示中文

需求 在实现react&#xff0c;里面引入antd时间选择器&#xff0c;默认显示为英文 思路 入口处使用ConfigProvider全局化配置&#xff0c;设置 locale 属性为中文来实现。官方文档介绍全局化配置 ConfigProvider - Ant Design 代码 import React from react; import { Prov…

道可云元宇宙每日资讯|浙江印发《加快人工智能能产业发展的指导意见》

道可云元宇宙每日简报&#xff08;2024年1月12日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 浙江印发《加快人工智能能产业发展的指导意见》 近日&#xff0c;浙江省人民政府办公厅印发《加快人工智能能产业发展的指导意见》。 《意见》指出&#xff0c;到 …

(Arcgis)matlab编程批量处理hdf5格式转换为tif格式

国家青藏高原科学数据中心 全球逐日0.05时空连续地表温度数据集&#xff08;2002-2022&#xff09; 此代码仅用于该数据集处理 版本&#xff1a;arcgis10.2 matlab2020 参考&#xff1a;MATLAB hdf(h5)文件转成tif图片格式&#xff08;批量处理&#xff09; 一、遇到问题 h5…

MidTool的AIGC与NFT的结合-艺术创作和版权保护的革新

在数字艺术和区块链技术的交汇点上&#xff0c;NFT&#xff08;非同质化代币&#xff09;正以其独特的方式重塑艺术品的收藏与交易。将MidTool&#xff08;https://www.aimidtool.com/&#xff09;的AIGC&#xff08;人工智能生成内容&#xff09;创作的图片转为NFT&#xff0c…

GEE数据集——2000 年至 2022 年与传感器无关的 MODIS 和 VIIRS LAI/FPAR CDR

2000 年至 2022 年与传感器无关的 MODIS 和 VIIRS LAI/FPAR CDR 该地理空间数据集包含关键的生物物理参数&#xff0c;即叶面积指数&#xff08;LAI&#xff09;和光合有效辐射分量&#xff08;FPAR&#xff09;&#xff0c;是描述陆地生态系统特征不可或缺的参数。该数据集解…

uniapp自定义封装只有时分秒的组件,时分秒范围选择

说实话&#xff0c;uniapp和uview的关于只有时分秒的组件实在是不行。全是日历&#xff0c;但是实际根本就不需要日历这玩意。百度了下&#xff0c;终于看到了一个只有时分秒的组件。原地址&#xff1a;原地址&#xff0c;如若侵犯请联系我删除 <template><view clas…

使用Eexcl调换txt文本中的两列数据

问题描述 本方法使用对txt存储的数据格式有特别要求。需要数据每行具有相同个数数据&#xff0c;且具有统一的间隔符号隔开。&#xff08;常见的间隔符号有tab键、空格、逗号、分号等&#xff09; 对于一个有空格间隔每行只有三列数据的txt文件&#xff0c;对调第二列和第三列…

Linux中关于cat命令详解

cat的作用 用于连接文件并打印到标准输出设备上 cat的参数 -b,-number-nonblank 打印时打印出序号,但不对空白行进行计算-E,--show-ends在每行结束处显示$-n,--number打印时打印出序号-s,--squeeze-blank当遇到有连续两行以上的空白行,就代换为一行的空白行 -T,--show-tabs 将…

为什么要使用云原生数据库?云原生数据库具体有哪些功能?

相比于托管型关系型数据库&#xff0c;云原生数据库极大地提高了MySQL数据库的上限能力&#xff0c;是云数据库划代的产品&#xff1b;云原生数据库最早的产品是AWS的 Aurora。AWS Aurora提出来的 The log is the database的理念&#xff0c;实现存储计算分离&#xff0c;把大量…

C++ n皇后问题 || 深度优先搜索模版题

n− 皇后问题是指将 n 个皇后放在 nn 的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n &#xff0c;请你输出所有的满足条件的棋子摆法。 输入格式 共一行&#xff0c;包含整数 n 。 …

雷达信号处理——恒虚警检测(CFAR)

雷达信号处理的流程 雷达信号处理的一般流程&#xff1a;ADC数据——1D-FFT——2D-FFT——CFAR检测——测距、测速、测角。 雷达目标检测 首先要搞清楚什么是检测&#xff0c;检测就是判断有无。雷达在探测的时候&#xff0c;会出现很多峰值&#xff0c;这些峰值有可能是目标…

C++学习笔记(三十三):c++ 宏定义

本节对c的宏定义进行描述。c使用预处理器来对宏进行操作&#xff0c;我们可以写一些宏来替换代码中的问题&#xff0c;c的宏是以#开头&#xff0c;预处理器会将所有的宏先进行处理&#xff0c;之后在通过编译器进行编译。宏简单说就是文本替换&#xff0c;可以替换代码中的任何…

swarm节点间通信问题-关闭checksum校验和

现场还原 客户有n台redhat虚拟机&#xff0c;构建了一个swarm集群&#xff0c;服务起来后&#xff0c;发现不同节点间的服务&#xff0c;无法互相访问。经运维大佬排查是服务器的checksum校验是开启状态&#xff0c;关闭即可~ 查看checksum状态 ethtool -k 内网网卡名称 | g…

Rhinoceros 8(犀牛8)中文授权版支持Win/Mac

Rhinoceros 8&#xff0c;也称为犀牛8&#xff0c;是一款专业的三维建模软件&#xff0c;深受设计师们的喜爱。这款软件为设计师提供了无限的创意空间和强大的工具&#xff0c;无论他们是产品设计师、建筑师还是工业设计师。 Rhinoceros 8采用了先进的NURBS建模技术&#xff0c…

Kafka外网访问

文章目录 一、背景二、需求三、调研四、配置内外网访问 一、背景 kafka机器只有内网IP&#xff0c;没有绑定外网网卡&#xff0c;但是可以在防火墙或通过其他有公网IP的设备上进行公网IP端口的映射。 二、需求 kafka集群端口映射后&#xff0c;可以通过外网IP端口进行数据生…

基于JavaWeb+BS架构+SpringBoot+Vue+Hadoop短视频流量数据分析与可视化系统的设计和实现

基于JavaWebBS架构SpringBootVueHadoop短视频流量数据分析与可视化系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 目  录 目  录 I 1绪 论 1 1.1开发背景 1 1.2开…