前言

课程设计开始了,实验很有意思,写博客总结学到的知识
白嫖容易,创作不易,学到东西才是真
本文原创,创作不易,转载请注明!!!
本文链接
个人博客:https://ronglin.fun/archives/185
PDF链接:见博客网站
CSDN: https://blog.csdn.net/RongLin02/article/details/118310091

为了美观,实验源代码在结尾处,整合版见下
链接:https://pan.baidu.com/s/1rXj1QJGuw-BVc5sQWret9w
提取码:Lin2
操作系统课程设计源代码
本次操作系统课程设计合集
操作系统课设之Windows 进程管理
操作系统课设之Linux 进程管理
操作系统课设之Linux 进程间通信
操作系统课设之Windows 的互斥与同步
操作系统课设之内存管理
操作系统课设之虚拟内存页面置换算法的模拟与实现
操作系统课设之基于信号量机制的并发程序设计
操作系统课设之简单 shell 命令行解释器的设计与实现
仅用于学习,如有侵权,请联系我删除

实验题目

简单 shell 命令行解释器的设计与实现

实验目的

本实验主要目的在于进一步学会如何在 Linux 系统下使用进程相关的系统调用,了解 shell 工作的基本原理,自己动手为 Linux 操作系统设计一个简单的命令接口。

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

背景知识:

本实验要使用创建子进程的 fork()函数,执行新的命令的 exec()系列函数,通常 shell 是等待子进程结束后再接受用户新的输入,这可以使用 waitpid()函数。以上相关的系统函数调用的说明请参见实验二的背景知识。

需求分析:

题目要求设计的 shell 是类似于 sh,bash,csh 等,必须支持以下内部命令:
cd <目录> 能输出PWD,更改工作目录
environ 列出所有环境变量字符串的设置,类似env 命令。
echo <内容> 显示 echo 后的内容且换行
help 提供对于本shell的帮助
jobs 输出 shell 当前的一系列子进程,必须提供子进程的命名和 PID 号。
quit,exit,bye 退出 shell。

总体设计:

我将输入的指令分成三类,第一类是错误指令,表示本shell没添加的shell;第二类是内部指令,就是需求中提到的指令,第三类是shell中自定义的指令,我设计的是如果输入的指令中含有”lin”就输出”linxx,希望你开心每一天”.
同时对于内部指令还分为两类,一类是需要子进程调用exec()的命令,有:“cd”,“environ”,“jobs”,其他都是不需要子进程的,直接按照输入处理就行了。

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

因为涉及到大量的字符串操作,本次在Linux下用c++实现,主要是用到string类型的方法。

第一部分 输入

因为输入需要将空格也输入进去,所以这里特意提一下

string cmd;
cout<<"请输入指令: ";
getline(cin,cmd);

第二部分 识别指令

这部分用的是string自带的方法find(),与设定好的指令一一比较

const string sysCmds[CMD_NUM]={"cd","environ","jobs","help","echo","quit","exit","bye"};
//0表示失败 1表示内部命令 2表示姓名int flag = 0;//内部命令的序号int index=-1;for(int i=0;i<CMD_NUM;i++){if(cmd.find(sysCmds[i]) != string::npos){flag = 1;index = i;if(index != 0){f_path.clear();}else{if(cmd.size()>2){string path(cmd,3,cmd.size()-3);f_path = f_path+"/"+path;}}break;}}if(flag==0 && cmd.find("lin") != string::npos){flag = 2;}

第三部分 指令逻辑设计

这一部分也是最难的一部分,分两类说
第一类 需要子进程
cd:
cd指令的实现是最麻烦的,因为要实现PWD的改变,我想的是用系统自带的ls命令,然后我的程序本身维护一个PWD路径,每次给ls子进程传入的参数都是基于我程序维护的PWD的绝对路径,然后还需要注意的是用户输入的都会用cd前缀,需要处理一下,提取关键路径,然后再合并到程序维护的PWD中,然后将新的PWD作为参数传入ls子进程中,实现cd命令效果。然后如果输入了其他指令,就把cd维护的PWD串清空。
核心代码如下:

if(cmd.find(sysCmds[i]) != string::npos){flag = 1;index = i;if(index != 0){f_path.clear();}else{if(cmd.size()>2){string path(cmd,3,cmd.size()-3);f_path = f_path+"/"+path;}}break;}

核心代码2部分


if(index == 0) //cd{if(cmd.size()>2){cout<<"当前路径:"<<f_path<<endl;execlp("/bin/ls","ls",f_path.c_str(),NULL);}else{execlp("/bin/ls","ls",NULL);}}

environ:
调用系统的env指令,execlp("env","",NULL);
jobs:
调用系统的pstree -p指令,execlp("pstree","-p",NULL);
echo:

string text(cmd,5,cmd.size()-5);
cout<<text<<endl;

echo单独说一下就是C++关于string用法,这是调用了string的构造函数,参数是cmd的[5, cmd.size())子串。
其余指令都是类似于echo,根据输入简单的处理一下,然后输出。

实验结果与分析

cd命令

environ命令

jobs命令



结果符合逻辑设计

小结与心得体会

本实验是一个综合性实验,涉及到了Linux下的C/C++编程,Linux进程创建,不过因为对Linux系统下C/C++编程较为熟悉了,所以本实验完成并未花费太长时间,主要是卡在cd指令如何实现比较好,同时对fork()函数的理解更加深入。同时对于Linux系统中shell命令行的执行过程有了更深入的了解。=w=

源代码

#include <sys/types.h>
#include <sys/wait.h>
#include <cstdio>
#include <unistd.h>
#include <iostream>
#include <string>#define CMD_NUM 8
using namespace std;const string sysCmds[CMD_NUM]={"cd","environ","jobs","help","echo","quit","exit","bye"};
//string.find("cd")!=string::nposint main()
{string f_path;while(true){string cmd;cout<<"请输入指令: ";getline(cin,cmd);//0表示失败 1表示内部命令 2表示姓名int flag = 0;//内部命令的序号int index=-1;for(int i=0;i<CMD_NUM;i++){if(cmd.find(sysCmds[i]) != string::npos){flag = 1;index = i;if(index != 0){f_path.clear();}else{if(cmd.size()>2){string path(cmd,3,cmd.size()-3);f_path = f_path+"/"+path;}}break;}}if(flag==0 && cmd.find("lin") != string::npos){flag = 2;}switch(flag){case 0:printf("指令错误,请重新输入,帮助请输入 help\n");break;case 1:if(index < 0){printf("指令错误,请重新输入,帮助请输入 help\n");}else if(index < 3) //需要调用子进程{pid_t pid;/* fork a child process */pid = fork();if (pid < 0){/* error occurred */fprintf(stderr, "Fork Failed");return 1;}else if (pid == 0){/* 子进程 */if(index == 0) //cd{if(cmd.size()>2){cout<<"当前路径:"<<f_path<<endl;execlp("/bin/ls","ls",f_path.c_str(),NULL);}else{execlp("/bin/ls","ls",NULL);}}else if(index == 1) //environ{execlp("env","",NULL);}else if(index == 2) //jobs{execlp("pstree","-p",NULL);}}else   /* 父进程 */{/* 父进程将一直等待,直到子进程运行完毕*/waitpid(pid,NULL,0);}}else    //不需要子进程{if(index == 3) //help{cout<<"RongLin's Shell:"<<endl;cout<<"cd [路径] -列出该路径下的文件"<<endl;cout<<"environ -列出系统的环境变量"<<endl;cout<<"jobs -查看当前进程树"<<endl;cout<<"help -帮助文档"<<endl;cout<<"echo [内容] -显示 echo 后的内容且换行"<<endl;cout<<"quit -退出本shell"<<endl;cout<<"exit -退出本shell"<<endl;cout<<"bye -退出本shell"<<endl;}else if(index == 4) //echo{string text(cmd,5,cmd.size()-5);cout<<text<<endl;}else    //quit exit bye{return 0;}}break;case 2:cout<<cmd<<",希望你开心每一天"<<endl;break;}}return 0;}

操作系统课设之简单 shell 命令行解释器的设计与实现相关推荐

  1. 操作系统课程设计---实验十 简单shell命令行解释器的设计与实现

    实验十 简单shell命令行解释器的设计与实现 完整课程设计源码及其报告查看:陈陈的操作系统课程设计 1.实验目的 本实验主要目的在于进一步学会如何在 Linux 系统下使用进程相关的系统调用,了解 ...

  2. C shell命令行解释器

    实现简单的shell命令解释器: <blockquote> 1)shell内部命令处理:cd,exit等 2)shell外部命令处理 3)I/O重定向: 4)管道: 5)其他功能 /*Au ...

  3. 操作系统课设之基于信号量机制的并发程序设计

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  4. 操作系统课设之虚拟内存页面置换算法的模拟与实现

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  5. 操作系统课设之内存管理

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  6. 操作系统课设之Windows 的互斥与同步

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  7. 操作系统课设之Linux 进程间通信

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  8. 操作系统课设之Linux 进程管理

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  9. 操作系统课设之Windows 进程管理

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

最新文章

  1. ORACLE查询删除重复记录
  2. swoole安装全纪录
  3. python属性访问顺序_Python 对象属性的访问
  4. NumPy 矩阵库(Matrix)
  5. java大数BinInteger
  6. 50 jQuery绑定事件 阻止默认事件发生 内置动画 each data
  7. Y400中通过easybcd在win7下面的安装Ubuntu14
  8. 【李宏毅2020 ML/DL】P62-65 More about Auto-encoder
  9. servlet输出中文乱码
  10. 如果你忘记了DotnetNuke站点的host和admin密码,解决方案
  11. 【电路仿真】基于matlab BP神经网络三相逆变器故障诊断【含Matlab源码 1655期】
  12. Summarize 2014 Look Ahead 2015
  13. mysql数据库的简单查询一般是查询什么,MySQL的简单查询语句(十五)
  14. 用电脑计算器计算以2为底的对数
  15. 小米手机计算机usb连接,小米手机连接电脑不显示usb选项
  16. ios-webkit-debug-proxy 说明
  17. <Halcon> 区域划分算子partition_dynamic和partition_rectangle
  18. # 支持向量机+hog特征实现手势识别
  19. Linux速记软件,Anki:让记忆更轻松的开源神器
  20. 简述python在量化金融中应用_Python金融量化

热门文章

  1. 获取机器安装.NET版本的几种方式
  2. [转]AIX平台下如何增加用户和组的名称长度
  3. c# winform TreeView与ListView的项互相拖动的应用[转载]
  4. Eclipse Rcp系列 http://www.blogjava.net/dreamstone/archive/2007/02/08/98706.html
  5. 这个 CSS 库竟能帮你做汉堡?
  6. 刚进职场的程序员,请万分珍重你的第一份工作,不要轻易辞职!
  7. 一招彻底破除数据孤岛!这家企业用数据集市整合了30套系统
  8. 还亲力亲为的蜡笔小新
  9. 深圳软件开发向前跳转会略过一些节点
  10. [图]罗技推出背光键盘