




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统课程设计实验报告实验六 简单shell班级: 07111301 学号: 1120131743 姓名: 谈兆年 学号: 1120131767 姓名: 徐欣廷 学号: 1120131746 姓名: 杨知水 学号: 1120131766 姓名: 杜田野 一、实验目的通过实现一个简单的shell命令解释器,加深对Windows系统调用的理解,同时了解管道命令的设计实现机制。二、实验内容在Windows平台上实现Linux的某些命令: 展开指定目录:myls dir 文件查看和连接:mycat -n file1 file2 显示文档的开头:myhead number filename 排序:my
2、sort file1 file2 统计可执行文件执行时间:mytime program1.exe 复制文件:mycp a b 自定义出错提示命令:mysl分别对应于Linux系统中的ls cat head sort time cp sl命令,在具体设计实现的时候用法做了简化。其中,mycat、myhead和mysort为三条管道命令,例如:mysort file1.txt file2.txt | myhead 6 | mycat -n三、程序设计与实现1、程序中使用的结构体(1) 处理输入命令字符串的自定义结构体CMD,定义如下struct CMD int cmdposi10;/记录每条管道命
3、令在命令字符串中是第几个字符串int lastcmdposi; /最后一条命令是第几条命令int subcmdparameter10;/每条管道命令所带的参数个数char* subcmd1010;/记录命令行中的每一个字符串cmd;对于输入命令:mysort file1.txt file2.txt | myhead 6 | mycat n字符串的位置: 0 1 2 3 4 5 6 7 8cmdposi: cmdposi0=0 cmdposi1=4 cmdposi2=7subcmd0: mysort file1.txt file2.txtsubcmdsubcmd1: myhead 6subcmd
4、2: mycat n(2) 创建进程时,PROCESS_INFORMATION结构返回有关新进程及其主线程的信息。其结构定义如下:typedef struct _PROCESS_INFORMATION HANDLE hProcess;/新创建进程的句柄 HANDLE hThread;/新创建进程的主线程的句柄 DWORD dwProcessId;/新创建进程的标识 DWORD dwThreadId;/新创建进程的主线程的标识 PROCESS_INFORMATION, *LPPROCESS_INFORMATION;(3) 获取系统时间时,使用到SYSTEMTIME结构体,其定义如下:typede
5、f struct _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结构体中。typedef struct _WIN32_FIND_DATA DWORD dwFileAttributes;/文件属
6、性 FILETIME ftCreationTime;/文件创建时间 FILETIME ftLastAccessTime;/文件最后一次访问时间 FILETIME ftLastWriteTime;/文件最后一次修改时间 DWORD nFileSizeHigh;/文件长度高32位 DWORD nFileSizeLow;/文件长度低32位 DWORD dwReserved0;/系统保留 DWORD dwReserved1;/系统保留 TCHAR cFileNameMAX_PATH;/长文件名 TCHAR cAlternateFileName14;/8.3格式文件名 WIN32_FIND_DATA,
7、*PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;(5) FILETIME结构体用来记录文件时间,该结构是表示100纳秒间隔数为64位值从1601年一月1日。typedef struct _FILETIME DWORD dwLowDateTime;/低32位 DWORD dwHighDateTime;/高32位 FILETIME, *PFILETIME, *LPFILETIME;2、使用的主要Windows API(1) CreateNamedPipe()函数作用:创建命名管道调用格式:HANDLE WINAPI CreateNamedPipe(LPCTSTR lpN
8、ame,/管道名称DWORD dwOpenMode,/管道打开方式DWORD dwPipeMode,/管道数据组织方式DWORD nMaxInstances,/管道最大实例量DWORD nOutBufferSize,/输出缓冲区长度DWORD nInBufferSize,/输入缓冲区长度DWORD nDefaultTimeOut,/默认等待时间LPSECURITY_ATTRIBUTES lpSecurityAttributes/安全属性);说明:调用成功返回管道的句柄,失败返回无效句柄值。(2) ConnectNamedPipe()函数作用:管道创建者与客户进行连接调用格式:BOOL WINA
9、PI ConnectNamedPipe(HANDLE hNamedPipe,/命名管道的句柄LPOVERLAPPED lpOverlapped/重叠属性);说明:如果lpOverlapped为NULL,那么,若管道已经连接,就返回TRUE,若发生错误,或者管道已经连接,就返回0;如果lpOverlapped有效,就返回零。(3) WaitNamedPipe()函数作用:客户等候与管道创建者建立连接调用格式:BOOL WINAPI WaitNamedPipe(LPCTSTR lpNamedPipeName,/将要连接的管道名称DWORD nTimeOut/等待时间,以秒为单位);说明:当管道创建
10、者已调用ConnectNamePipe()函数等待与一个客户连接时,该函数成功返回非0,如果失败,或者管道不存在,则返回0。(4) DisconnectNamedPipe()函数作用:管道创建者断开与一个客户连接的命名管道调用格式:BOOL WINAPI DisconnectNamedPipe(_In_ HANDLE hNamedPipe);说明:hNamedPipe为要断开管道的句柄,非0表示成功,0表示失败。(5)其他的一些API已经在之前的四个实验中详细介绍过,故在此不做赘述。有CreateProcess()、WaitForSingleObject()、GetSystemTime()、F
11、indFirstFile()、FindNextFile()、CreateFile()、ReadFile()、WriteFile()、GetFileTime()、SetFileTime()、CreateDirectory()等。四、实验结果及分析1、实验结果图一 双管道命令如上图一所示,首先显示file1.txt和file2.txt的内容,myhead命令取前3行输出,mysort命令则是将那3行内容排序后再输出,接着mycat命令最后加上行标再次输出。图二 单管道命令如上图二所示,首先显示file1.txt和file2.txt的内容,mysort命令将其排序后输出,接着myhead命令取其前3
12、行输出。图三 mytime命令、myls命令如上图三所示,mytime命令可以计算可执行程序的执行时间,myls命令可以展开指定目录,并显示文件名称、创建时间、修改时间和文件大小。图四 mycp命令如上图四所示,mycp命令其实就是实验五的任务,在将其收录进我们shell中。图五 mysl命令如上图五所示,在Linux系统中,ls命令是很常用的,所以程序员一旦不小心敲错了,误写成sl也是情有可原的,这时Linux的terminal会显示一辆跑动的小火车,以此提示程序员。上述mysl命令的设计也是基于此,这也使得我们的shell变得生动有趣。2、实验分析(1)UNIX系统进程之间的通信方式简介以
13、及对比管道通信:管道通信允许进程之间按照FIFO方式进行传输数据,一些进程用write命令向管道写入数据,另一些进程用read命令从管道中读数据,且彼此之间同步执行,管道通信是进程使用文件系统中文件进行的,只要通信的双方基本同步,可认为这个文件是无限大的。无名管道是一个临时文件,当文件被关闭后,文件就不复存在了,它是提供给同族进程之间使用的通信办法。有名管道则是实现了无家族关系进程之间的通信,任何知道管道名字的进程都可以打开使用,有名管道文件一旦被创建后,磁盘上有一个对应的目录项和索引节点,它与普通文件类似,是通过路径名存取的,只要这种文件不显示删除,它就永远存在,只是文件长度为零。信号量:信
14、号量机制的功能是比较强的,它提供了信号量集合。这种机制是通过P、V操作原语实现的,每次只进行单位数据的交互,通信效率比较低。消息缓冲&共享内存:采用消息缓冲和共享内存区是,进程之间可以进行大批数据的交互。其中,信号量、消息缓冲和共享内存区都属于UNIX系统V的交互进程通信使用的资源,又成IPC资源。IPC属鸡的数据结构在进程之间请求IPC资源(信号量、消息队列和共享内存区)(2)Windows对于管道通信的设计机制简介Windows最大的特点是建立一个简单的客户机/服务器程序设计体系,在这个体系结构中,在客户机与服务器之间,数据既可以单向传递,也可双向流动。对命令管道服务器和客户机来说,两者的
15、区别在于:服务器是唯一一个有权创建命名管道的进程,也只有它才能接受管道客户机的连接请求。对一个客户机应用来说,它只能同一个现成的命名管道服务器建立连接。在客户机应用和服务器应用之间,一旦建立好连接,两个进程都能使用标准的Win32函数,在管道上进行数据的读取与写入。(3)客户与服务器(管道创建者)之间使用管道通信的步骤:a.建立连接,服务端通过函数CreateNamedPipe()创建一个命名管道的示例并返回用于今后操作的句柄。客户端通过调用WaitNamedPipe()使服务进程等待来自客户的示例连接,如果在超时值变为0之前,有一个管道可以为连接使用,则WaitNamePipe()将返回TR
16、UE,并通过CreateFile()来呼叫服务端的连接。此时服务端将接受客户端的连接请求,成功建立连接,服务端ConnectNamedPipe()返回TRUE,客户端CreateFile()将返回一指向管道文件的句柄。b.通信实现,连接建立之后,客户端与服务器使用得到的管道文件句柄通过调用WriteFile()和ReadFile(),彼此之间进行信息交换。c.连接终止,当客户端与服务端的通信结束,客户端调用CloseHandle()断开连接;而服务端接着调用DisconnectNamedPipe()。(4)实验设计简介对于管道命令,本shell中只有myhead、mycat、mysort这三个
17、管道命令。相互协作可以实现管道(当然,这三个命令也可以单独使用),就拿myhead来说,它的调用形式只有如下四种形式:* | myhead 3 | * myhead 3 file1.txt* | myhead 3myhead 3 file1.txt | *对于此,设置两个标记 LeftMycatPipeFlag、LeftMysortPipeFlag 用来记录myhead命令前面是否出现了管道,同时设置标记 islastcmd 来记录 myhead 是否为最后一条子命令。这样就可以通过这三个标志来分情况处理。具体设计实现见代码:对于命令“mysort file1.txt | myhead 6 |
18、 mycat n”来说:LeftMycatPipeFlag = find_left_mycat_pipe();LeftMysortPipeFlag = find_left_mysort_pipe();int existence = LeftMycatPipeFlag | LeftMysortPipeFlag;/Judge the existence of left pipeif(existence=1 & islastcmd=0) /eg: mycat -n file1.txt | myhead 3 | mysort /get data from pipeif(LeftMycatPipeFla
19、g = 1)get_left_mycat_pipe();else if(LeftMysortPipeFlag = 1)get_left_mysort_pipe();/create pipe, place datacreate_myhead_pipe();else if(existence=0 & islastcmd=1) /eg: myhead 3 file1.txt/process data ,then printprocess_file_print();else if(existence=1 & islastcmd=1) /eg: mycat -n file1.txt | myhead 3
20、/get data from pipe,then printif(LeftMycatPipeFlag = 1)get_left_mycat_pipe();else if(LeftMysortPipeFlag = 1)get_left_mysort_pipe();else if(existence=0 & islastcmd=0) /eg: myhead 3 file1.txt | mycat -n /process data ,put into bufferprocess_file_into_buffer();/create pipe, place datacreate_myhead_pipe
21、();管道通信原理图如下所示: (5)shell各部分说明- shell 主控程序 400行 - 对输入的命令进行处理,为各个命令创建进程,运行结束时终止进程- myls 展开指定目录 200行 -使用格式:myls dir参数说明:若dir不为“.”,则展开dir,否则展开当前目录,显示文件创建时间、最后修改时间、大小等基本属性- mycat 文本文件查看和连接 400行 -使用格式:mycat -n file1 file2 参数说明:由1开始对所有输出的行数编号: -n- myhead 显示文档的开头 300行 -使用格式:myhead number filename参数说明:number
22、为要显示的行数- mysort 排序 300行 -使用格式:mysort file1 file2 参数说明:命令用于将所有文件内容按第一列来排序(若第一列相同,则看第二列)- mycp 复制文件 150行 -使用格式:mycp sour_dir des_dir参数说明:sour_dir为源目录,des_dir为新创建的目录。- mytime 统计可执行文件执行时间 100行 -使用格式:mytime program1.exe参数说明:参数为一个可执行文件- mysl 错误提示 400行 -使用格式:mysl说明:在Linux系统中,ls命令是很常用的,经常会误写成sl,这时shell会显示一辆
23、跑动的小火车,以此提示程序员。命令举例:(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 2 file2.txt 输出file2.txt的前2行
24、(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三条管道命令的实现。在实验中,学习了很多关于UN
25、IX和Windows的管道设计机制相关知识。实验中最大的挑战莫过于对于管道命令的各个字符串的处理,为此我特地设计了CMD结构体来分割管道命令,还有实验中需要处理诸多函数,函数相互调用的时候,接口设计十分重要。光是某些单个命令的设计实现就需要400行的代码量,可想而知,若是接口设计的不好,势必会给后续工作带来影响。尤其是对于命令所带的参数的处理尤其麻烦,还有为每个命令创建进程的时候,szCmdline所带的参数也是需要小心处理。本次实验无疑极大地提升了我的项目动手能力,一个星期持续不断的编程还是非常刺激的,这其中遇到的问题胜不胜数,比如说,服务器端创建pipe时,buffer缓冲区不能为空:若为空,则在创建pipe时调用的Writ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 3029-2025船用通风附件技术条件
- 职场情绪与压力管理专题培训
- 质量管理系统培训
- 机架人员安全培训教育
- 城市建筑排水设计重点基础知识点
- 办公家具业务培训
- 气球使用协议书
- 2024秋招北森题库数学百题
- 物品转让协议书
- 商业场所租赁扩展协议
- 计划生育选择试题及答案
- 法律文化-形考作业3-国开(ZJ)-参考资料
- 2025届东北三省四市高三第二次联考英语试卷含答案
- 2025-2030中国振动监测系统行业市场发展趋势与前景展望战略研究报告
- 《中华茶艺文化》课件
- 华为系统面试题及答案
- 主题班会:高中男女生正常交往课件
- 2025年第33批 欧盟REACH SVHC高度关注物质清单247项
- 漳州市城市规划管理技术规定
- T8联考·2025届高三下学期3月联合测评数学试卷(含答案)
- 以太网技术相关的重要考试题目试题及答案
评论
0/150
提交评论