操作系统课程作业实现shell
更新时间:2023-04-29 20:14:01 阅读量: 实用文档 文档下载
- 操作系统课程作业hw推荐度:
- 相关推荐
操作系统课程设计实验报告
实验六简单shell
班级:07111301 学号:1120131743 姓名:谈兆年
学号:1120131767 姓名:徐欣廷
学号:1120131746 姓名:杨知水
学号:1120131766 姓名:杜田野
一、实验目的
通过实现一个简单的shell命令解释器,加深对Windows系统调用的理解,同时了解管道命令的设计实现机制。
二、实验内容
在Windows平台上实现Linux的某些命令:
?展开指定目录:myls [dir]
?文件查看和连接:mycat [-n] [file1 file2……]
?显示文档的开头:myhead number filename
?排序:mysort [file1 file2 ……]
?统计可执行文件执行时间:mytimeprogram1.exe
?复制文件:mycp a b
?自定义出错提示命令:mysl
分别对应于Linux系统中的ls cat head sort timecpsl命令,在具体设计实现的时候用法做了简化。其中,mycat、myhead和mysort为三条管道命令,例如:mysort file1.txt file2.txt | myhead 6 | mycat -n
三、程序设计与实现
1、程序中使用的结构体
(1)处理输入命令字符串的自定义结构体CMD,定义如下
struct CMD{
intcmdposi[10];//记录每条管道命令在命令字符串中是第几个字符串
intlastcmdposi;//最后一条命令是第几条命令
1
操作系统课程设计实验报告
2
intsubcmdparameter[10];//每条管道命令所带的参数个数 char* subcmd[10][10];//记录命令行中的每一个字符串
}cmd;
对于输入命令:mysort file1.txt file2.txt | myhead 6 | mycat –n 字符串的位置: 0 1 2 3 4 5 6 7 8
cmdposi[]:
cmdposi[0]=0 cmdposi[1]=4 cmdposi[2]=7
subcmd[0]: mysort file1.txt file2.txt
subcmd[][]
subcmd[1]: myhead 6
subcmd[2]: mycat –n
(2)创建进程时,PROCESS_INFORMATION 结构返回有关新进程及其主线程的信息。其结构定义如下:
typedefstruct _PROCESS_INFORMATION {
HANDLE hProcess;
//新创建进程的句柄 HANDLE hThread; //新创建进程的主线程的句柄
DWORD dwProcessId; //新创建进程的标识
DWORD dwThreadId;
//新创建进程的主线程的标识 } PROCESS_INFORMATION, *LPPROCESS_INFORMATION;
(3)获取系统时间时,使用到SYSTEMTIME 结构体,其定义如下:
typedefstruct _SYSTEMTIME {
WORD wYear;//年
WORD wMonth;//月
WORD wDayOfWeek;//星期
WORD wDay;//天
WORD wHour;//小时
WORD wMinute;//分钟
WORD wSecond;//秒
WORD wMilliseconds;//毫秒
操作系统课程设计实验报告
} SYSTEMTIME, *PSYSTEMTIME;
(4) 在调用函数FindFirstFile、FindNextFile时,将找到的文件的信息存储在win32_FIND_DATA结构体中。
typedefstruct _WIN32_FIND_DATA {
DWORD dwFileAttributes;//文件属性
FILETIME ftCreationTime;//文件创建时间
FILETIME ftLastAccessTime;//文件最后一次访问时间
FILETIME ftLastWriteTime;//文件最后一次修改时间
DWORD nFileSizeHigh;//文件长度高32位
DWORD nFileSizeLow;//文件长度低32位
DWORD dwReserved0;//系统保留
DWORD dwReserved1;//系统保留
TCHAR cFileName[MAX_PATH];//长文件名
TCHAR cAlternateFileName[14];//8.3格式文件名
} WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;
(5)FILETIME结构体用来记录文件时间,该结构是表示100纳秒间隔数为64位值从1601年一月1日。
typedefstruct _FILETIME {
DWORD dwLowDateTime;//低32位
DWORD dwHighDateTime;//高32位
} FILETIME, *PFILETIME, *LPFILETIME;
2、使用的主要Windows API
(1)CreateNamedPipe()函数
作用:创建命名管道
调用格式:
HANDLE WINAPI CreateNamedPipe(
LPCTSTR lpName,//管道名称
DWORD dwOpenMode,//管道打开方式
3
操作系统课程设计实验报告
DWORD dwPipeMode,//管道数据组织方式
DWORD nMaxInstances,//管道最大实例量
DWORD nOutBufferSize,//输出缓冲区长度
DWORD nInBufferSize,//输入缓冲区长度
DWORD nDefaultTimeOut,//默认等待时间
LPSECURITY_ATTRIBUTES lpSecurityAttributes//安全属性
);
说明:调用成功返回管道的句柄,失败返回无效句柄值。
(2)ConnectNamedPipe()函数
作用:管道创建者与客户进行连接
调用格式:
BOOL WINAPI ConnectNamedPipe(
HANDLE hNamedPipe,//命名管道的句柄
LPOVERLAPPED lpOverlapped//重叠属性
);
说明:如果lpOverlapped为NULL,那么,若管道已经连接,就返回TRUE,若发生错误,或者管道已经连接,就返回0;如果lpOverlapped有效,就返回零。
(3)WaitNamedPipe()函数
作用:客户等候与管道创建者建立连接
调用格式:
BOOL WINAPI WaitNamedPipe(
LPCTSTR lpNamedPipeName,//将要连接的管道名称
DWORD nTimeOut//等待时间,以秒为单位
);
说明:当管道创建者已调用ConnectNamePipe()函数等待与一个客户连接时,该函数成功返回非0,如果失败,或者管道不存在,则返回0。
(4)DisconnectNamedPipe()函数
作用:管道创建者断开与一个客户连接的命名管道
4
操作系统课程设计实验报告
调用格式:
BOOL WINAPI DisconnectNamedPipe(_In_ HANDLE hNamedPipe);
说明:hNamedPipe为要断开管道的句柄,非0表示成功,0表示失败。
(5)其他的一些API已经在之前的四个实验中详细介绍过,故在此不做赘述。有CreateProcess()、WaitForSingleObject()、GetSystemTime()、FindFirstFile()、FindNextFile()、CreateFile()、ReadFile()、WriteFile()、GetFileTime()、SetFileTime()、CreateDirectory()等。
四、实验结果及分析
1、实验结果
图一双管道命令
如上图一所示,首先显示file1.txt和file2.txt的内容,myhead命令取
前3行输出,mysort命令则是将那3行内容排序后再输出,接着mycat命令最
后加上行标再次输出。
5
操作系统课程设计实验报告
6
图二 单管道命令
如上图二所示,首先显示file1.txt 和file2.txt 的内容,mysort 命令将其排序后输出,接着myhead 命令取其前3行输出。
图三 mytime 命令、myls 命令
如上图三所示,mytime 命令可以计算可执行程序的执行时间,myls 命令可以展开指定目录,并显示文件名称、创建时间、修改时间和文件大小。
操作系统课程设计实验报告
7
图四 mycp 命令
如上图四所示,mycp 命令其实就是实验五的任务,在将其收录进我们shell 中。
图五 mysl 命令
如上图五所示,在Linux 系统中,ls 命令是很常用的,所以程序员一旦不小心敲错了,误写成sl 也是情有可原的,这时Linux 的terminal 会显示一辆跑动的小火车,以此提示程序员。上述mysl 命令的设计也是基于此,这也使得我们的shell 变得生动有趣。
操作系统课程设计实验报告
2、实验分析
(1)UNIX系统进程之间的通信方式简介以及对比
管道通信:
管道通信允许进程之间按照FIFO方式进行传输数据,一些进程用write命令向管道写入数据,另一些进程用read命令从管道中读数据,且彼此之间同步执行,管道通信是进程使用文件系统中文件进行的,只要通信的双方基本同步,可认为这个文件是无限大的。
无名管道是一个临时文件,当文件被关闭后,文件就不复存在了,它是提供给同族进程之间使用的通信办法。
有名管道则是实现了无家族关系进程之间的通信,任何知道管道名字的进程都可以打开使用,有名管道文件一旦被创建后,磁盘上有一个对应的目录项和索引节点,它与普通文件类似,是通过路径名存取的,只要这种文件不显示删除,它就永远存在,只是文件长度为零。
信号量:
信号量机制的功能是比较强的,它提供了信号量集合。这种机制是通过P、V 操作原语实现的,每次只进行单位数据的交互,通信效率比较低。
消息缓冲&共享内存:
采用消息缓冲和共享内存区是,进程之间可以进行大批数据的交互。
其中,信号量、消息缓冲和共享内存区都属于UNIX系统V的交互进程通信使用的资源,又成IPC资源。IPC属鸡的数据结构在进程之间请求IPC资源(信号量、消息队列和共享内存区)
(2)Windows对于管道通信的设计机制简介
Windows最大的特点是建立一个简单的客户机/服务器程序设计体系,在这个体系结构中,在客户机与服务器之间,数据既可以单向传递,也可双向流动。对命令管道服务器和客户机来说,两者的区别在于:服务器是唯一一个有权创建命名管道的进程,也只有它才能接受管道客户机的连接请求。对一个客户机应用来说,它只能同一个现成的命名管道服务器建立连接。在客户机应用和服务器应用之间,一旦建立好连接,两个进程都能使用标准的Win32函数,在管道上进行数据的读取与写入。
8
操作系统课程设计实验报告
(3)客户与服务器(管道创建者)之间使用管道通信的步骤:
a.建立连接,服务端通过函数CreateNamedPipe()创建一个命名管道的示例并返回用于今后操作的句柄。客户端通过调用WaitNamedPipe()使服务进程等待来自客户的示例连接,如果在超时值变为0之前,有一个管道可以为连接使用,则WaitNamePipe()将返回TRUE,并通过CreateFile()来呼叫服务端的连接。此时服务端将接受客户端的连接请求,成功建立连接,服务端ConnectNamedPipe()返回TRUE,客户端CreateFile()将返回一指向管道文件的句柄。
b.通信实现,连接建立之后,客户端与服务器使用得到的管道文件句柄通过调用WriteFile()和ReadFile(),彼此之间进行信息交换。
c.连接终止,当客户端与服务端的通信结束,客户端调用CloseHandle()断开连接;而服务端接着调用DisconnectNamedPipe()。
(4)实验设计简介
对于管道命令,本shell中只有myhead、mycat、mysort这三个管道命令。
相互协作可以实现管道(当然,这三个命令也可以单独使用),就拿myhead来说,它的调用形式只有如下四种形式:
****|myhead 3 | ****
myhead 3 file1.txt
**** | myhead 3
myhead 3 file1.txt | ****
对于此,设置两个标记LeftMycatPipeFlag、LeftMysortPipeFlag用来记录myhead 命令前面是否出现了管道,同时设置标记islastcmd 来记录myhead 是否为最后一条子命令。这样就可以通过这三个标志来分情况处理。具体设计实现见代码:
9
操作系统课程设计实验报告
10
对于命令“mysort file1.txt | myhead 6 | mycat –n ”来说: 管道通信原理图如下所示:
操作系统课程设计实验报告
(5)shell各部分说明
---------------------- shell 主控程序 400行 ------------------------- 对输入的命令进行处理,为各个命令创建进程,运行结束时终止进程
---------------------- myls 展开指定目录 200行 ---------------------- 使用格式:myls [dir]
参数说明:若dir不为“.”,则展开dir,否则展开当前目录,显示文件创建时间、最后修改时间、大小等基本属性
------------------ mycat 文本文件查看和连接 400行 ------------------- 使用格式:mycat [-n] [file1 file2 ……]
参数说明:由1开始对所有输出的行数编号: -n
-------------------- myhead 显示文档的开头 300行 -------------------- 使用格式:myhead number filename
参数说明:number为要显示的行数
------------------------ mysort 排序 300行 -------------------------- 使用格式:mysort [file1 file2 ……]
参数说明:命令用于将所有文件内容按第一列来排序(若第一列相同,则看第二列……)
----------------------- mycp 复制文件 150行 ------------------------ 使用格式:mycpsour_dirdes_dir
参数说明:sour_dir为源目录,des_dir为新创建的目录。
--------------- mytime 统计可执行文件执行时间 100行 ----------------- 使用格式:mytime program1.exe
参数说明:参数为一个可执行文件
------------------------ mysl 错误提示 400行 -----------------------
11
操作系统课程设计实验报告
使用格式:mysl
说明:在Linux系统中,ls命令是很常用的,经常会误写成sl,这时shell会显示一辆跑动的小火车,以此提示程序员。
命令举例:
(1)mycat -n file1 | myhead 3 将文件 file1 的内容加上行号后显示前3行(2)myhead 3 file1 | mycat -n 将文件 file1 的内容显示前3行后加上行号(注:上述两条命令的操作最终结果等价)
(3)mysort file1 file2 | mycat -n | myhead 5 将 file1 和 file2 的内容合并排序、加上行号、显示前5行
(4)mycat -n file1.txt 把file1.txt的内容加行标后输出
(5)myhead 2file2.txt 输出file2.txt的前2行
(6)mysort file1.txt 把file1.txt的内容排序后输出
(7)mytime program1.exe 显示program1.exe的执行时间
(8)mycp a b 将文件夹a的内容复制到文件夹b
(9)myls . 展开当前目录
(10)myls a 展开指定目录a
(11)mysl 显示跑动的小火车
五、实验收获与体会
实验代码量达到了2300行,实现了简单shell,基本达到了要求。不过由于时间关系实验中还有很多缺陷和不足有待改进。
谈兆年的心得体会:
本次试验中,我负责shell整体框架的设计以及myhead、mysort、mycat三条管道命令的实现。在实验中,学习了很多关于UNIX和Windows的管道设计机制相关知识。
实验中最大的挑战莫过于对于管道命令的各个字符串的处理,为此我特地设计了CMD结构体来分割管道命令,还有实验中需要处理诸多函数,函数相互调用的时候,接口设计十分重要。光是某些单个命令的设计实现就需要400行的代码量,可想而知,若是接口设计的不好,势必会给后续工作带来影响。尤其是对于
12
操作系统课程设计实验报告
命令所带的参数的处理尤其麻烦,还有为每个命令创建进程的时候,szCmdline 所带的参数也是需要小心处理。
本次实验无疑极大地提升了我的项目动手能力,一个星期持续不断的编程还是非常刺激的,这其中遇到的问题胜不胜数,比如说,服务器端创建pipe时,buffer缓冲区不能为空:若为空,则在创建pipe时调用的WriteFile()没有在pipe中写入任何数据,然后客户端和pipe建立连接后,企图调用ReadFile()获取pipe中的数据时,发现里面什么都没有,则ReadFile()调用失败。
徐欣廷的心得体会:
在这次大作业中,我负责完成myls命令,由于代码的实现过程比较简单,在Windows下就是对目录的读取过程,需要自己添加的内容就是对内容的转义。比方说文件日期,从FILETIME转换成可读的本地时间、文件长度的高32位和低32位的拼接等操作。
因为涉及到的进程数量比较多,所以在子进程的代码中,需要注意的就是对内存的控制,每次new操作的内存空间在不需要的时候要及时释放,否则会导致内存泄漏,产生严重的后果;其次,对于打开的文件句柄,需要及时关闭,否则经过多次调用之后可能会导致系统调用出现异常。经过本次实验,我掌握了很多操作系统方面的知识,在之后的实际应用中会带来极大的帮助。
杨知水的心得体会:
在这最后一次课程设计中,在我们小组共同努力下完成了一个shell命令解释器的基本功能。我们在这次综合了几乎所有实验课知识的实验中收益颇丰,不仅巩固了之前几次实验的知识,而且学到了不少新的知识,比如对于管道通信的理解等等。
对于整个实践课程,不仅培养了我们独立思考、动手操作以及合作编程的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能真正的掌握知识。
杜田野的心得体会:
首先感谢小组成员的大力帮助,才能这样顺利的完成任务。在其中,我自己也是锻炼了自我的学习能力,当然还学会了及时与同学交流,向老师请教。我认识到了,学习其实是一个循序渐进的过程,但同时也是一个突飞猛进的过程,有
13
操作系统课程设计实验报告
的时候会卡在哪一个结点,等待一段时间搞定就会有很大收获。
刚开始时候看了课本,但是因为这一次的实验算是自己构思,必须提前构思好,要不然编起来会思路不清。
14
正在阅读:
操作系统课程作业实现shell04-29
FreeScale - HCS12系列单片机教程(dg128)09-15
晚安短信大全,晚安祝福短信,情侣晚安短信,搞笑晚安短信02-24
九年级化学上册第二单元探索水世界2.2水分子的变化同步测试题新版鲁教版01-04
2019-新当选镇人大主席后表态发言word版本(5页)03-08
四年级运算定律练习题03-08
2013年中考数学复习专题讲座7:归纳猜想型问题(2)03-03
我国水文行业现状及发展02-01
浙江建筑业要向现代建筑服务业转变03-08
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 操作系统
- 作业
- 课程
- 实现
- shell
- 2015-2016九年级语文上册 11 我的叔叔于勒练习2 (新版)新人教版
- 人教版七年级数学下册《5.2.2平行线的判定》导学案
- 水电站防汛应急预案完整版
- 2018年东南大学艺术学院913设计理论考研核心题库
- 农村幼儿园家长教育观念转变策略的探索
- 手把手如何管控工厂UPPH包学会
- ★汽车驾照驾驶(学车)理论考试科目一过关知识电子教案
- (完整版)5G无线维护考试题及答案-华为设备
- 关于技术工人工作总结
- (精编)2019年浙江省高考英语试卷
- 2013年普通高等学校招生全国统一考试陕西省理科数学(无答案)
- 灵活用工合作伙伴服务协议模板
- 2010年教师资格证考试中学教育学章节考点讲解
- 隧道工程关键部位质量控制
- 一级建造师2020年《工程法规》模拟
- 八级数学上册学案:《2.6实数第1课时》(无答案)(北师大版) (2)
- 旅游经济学第四章试题
- 度米作文汇编之小人物大作为-初一作文
- “解放者”的风采【2014年中考题】【
- 岳麓版八年级历史上册教案