操作系统实验1:Linux命令解释程序shell的设计与实现

code link: 欢迎star

1. 实验目的

探索、理解并掌握操作系统命令解释器的设计原理和实现机制,基于 Linux 内核进行相应命令解释程序的设计和实现,并在 Linux 操作系统平台上加以测试验证。

2. 实验内容

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

3. 实验思路

Shell程序一共分为4个模块,分别是命令提示符显示模块、命令输入模块、命令执行模块和内存回收模块。
命令提示符模块。输出个人信息与满足实验自主完成检验要求有机结合。再输出当前工作目录。最后是命令键入提示符 $ 。
命令输入模块。设置最大单个命令长度,以空格为分割符,读入用户输入的命令。以换行符为停止符号,停止读入命令。
命令执行模块。优先匹配内置命令,配置成功,调用内置命令函数进行处理。程序结束。匹配失败,判断为外部命令,在PATH中寻找相应的外部命令。建立子进程,子进程利用execvp函数调用外部命令;主进程使用waitpid函数等待子进程调用结束。最后将输入的命令加入历史命令清单中,以备查询。
内存回收模块。回收命令相关字符内存,防止内存泄漏和新旧命令的冲突。

4. 程序实现

4.1 相关环境介绍

宿主机系统:window 10 21H2
虚拟机程序:VMware Workstation Player 16.2.4
虚拟机系统:ubuntu-22.04.1-desktop-amd64
开发环境:Clion-2022.2.1-Linux
编译器:Clang LLVM 14.0.6

4.2 内置命令选择和结构体设计

结构体

struct builtin_command{
    string name;
    int (*address)(char **);
};

其中name为内置命令名称,用作匹配。Address为函数指针,调用使用。
选取的内置命令为cd、history、mkdir、cp、date命令。Cd完成工作目录的变换。History显示历史调用过的命令。Mkdir创建空的文件夹。Cp命令完成文件的复制。Date命令显示本地格式化时间。

4.3 重要函数说明和流程图

Execvp函数,可以自动搜索PATH环境。只要再把home目录加入到PATH中即可完成实验要求的外部命令搜索。
My_cd函数,调用chdir转移工作目录。
My_history函数,打印所有历史命令。主要依赖execute函数中执行命令后自动维护历史命令列表。
My_mkdir。调用access判断目标文件夹是否存在。Mkdir函数创建目标文件夹。
My_date。调用time获得标准时间以来的秒数,ctime格式转换为当地时间。
My_cp。先判断源文件是否存在,再以源文件大小作为批复制大小,并判断此大小是否超出最大上限,超过批复制大小取最大上限。使用系统调用复制函数执行复制。最后回收buffer内存,防止内存泄漏。
execute函数
5个内置函数流程图

5. 程序验证

【程序验证图片含敏感信息,略去】

进入程序。
输入提示符正常。显示工作目录正常。$ 命令输入提示正常。Cp 复制Cmakecache文件到a.txt,成功。Cd转换到父目录成功。Date成功。Mkdir 创建新文件夹b成功。History输出历史命令正常。
其中ls调用外部命令。最后调用外部命令查看gcc版本,含option命令调用成功。
程序运行正常。效果很好。相关实验要求和自定目标圆满完成。

6. 实验汇总

6.1. 实验要求完成情况

选取和设计了ls、cp、cd、date、history五个内置命令。
外部命令选取了exec函数族的execvp函数可以直接自动查找PATH路径,这样直接就可以把命令传递给execvp,进而完成了要求4.
Cp命令采用系统调用拷贝命令完成,这点参考了翟高寿老师的ppt。
Linux系统中测试参照上文。

6.2. 技术难点及解决方案

对linux接触比较少,对于实验中的要求由许多不理解的地方,所幸在老师同学的帮助下完成了实验,这些难点包括虚拟机的使用、Ubuntu系统的安装、相关unistd.h函数的使用。
特别是最后的unistd.h中有许多函数需要学习,包括但不限于chdir()、mkdir(),还有许多拷贝函数,时间函数需要学习。其实算法上的实现并没有多复杂,主要还是有许多新知识的学习,包括刚刚开始学习的进程管理,execute函数中就有需要创建新进程的地方和进程同步的地方。

6.3. 实验感想和经验总结

本次实验总的来说收获很多,第一次实际操作linux系统并且在其上编程,更了解了shell的最简单的样式,还自主学习了进程的同步概念,总的来说,收获很多。
因为之前只是听说过Linux,只在学校服务器上简单操作过,没有在本地运行过。这次可以在本地从虚拟机的使用开始,确实是一次很好的体验。特别是,许多操作系统的知识老师还没有讲授,自习的过程也是很值得总结。这样老师引导自主学习,完成实验任务的学习过程,真的非常让人享受。

6.4. 参考链接

  • Making your own Linux Shell in C https://www.geeksforgeeks.org/making-linux-shell-c/
  • Write a Shell in C by Stephen Brennan https://brennan.io/2015/01/16/write-a-shell-in-c/
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值