操作系统课程作业实现shell_第1页
操作系统课程作业实现shell_第2页
操作系统课程作业实现shell_第3页
操作系统课程作业实现shell_第4页
操作系统课程作业实现shell_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操作系统课程作业实现shell操作系统课程作业实现shell操作系统课程作业实现shellxxx公司操作系统课程作业实现shell文件编号:文件日期:修订次数:第1.0次更改批准审核制定方案设计,管理制度实验六简单shell一、实验目的通过实现一个简单的shell命令解释器,加深对Windows系统调用的理解,同时了解管道命令的设计实现机制。二、实验内容在Windows平台上实现Linux的某些命令:展开指定目录:myls[dir]文件查看和连接:mycat[-n][file1file2……]显示文档的开头:myheadnumberfilename排序:mysort[file1file2……]统计可执行文件执行时间:mytime复制文件:mycpab自定义出错提示命令:mysl分别对应于Linux系统中的lscatheadsorttimecpsl命令,在具体设计实现的时候用法做了简化。其中,mycat、myhead和mysort为三条管道命令,例如:mysort|myhead6|mycat-n三、程序设计与实现1、程序中使用的结构体(1)处理输入命令字符串的自定义结构体CMD,定义如下structCMD{ intcmdposi[10];立连接,服务端通过函数CreateNamedPipe()创建一个命名管道的示例并返回用于今后操作的句柄。客户端通过调用WaitNamedPipe()使服务进程等待来自客户的示例连接,如果在超时值变为0之前,有一个管道可以为连接使用,则WaitNamePipe()将返回TRUE,并通过CreateFile()来呼叫服务端的连接。此时服务端将接受客户端的连接请求,成功建立连接,服务端ConnectNamedPipe()返回TRUE,客户端CreateFile()将返回一指向管道文件的句柄。 b.通信实现,连接建立之后,客户端与服务器使用得到的管道文件句柄通过调用WriteFile()和ReadFile(),彼此之间进行信息交换。 c.连接终止,当客户端与服务端的通信结束,客户端调用CloseHandle()断开连接;而服务端接着调用DisconnectNamedPipe()。(4)实验设计简介对于管道命令,本shell中只有myhead、mycat、mysort这三个管道命令。相互协作可以实现管道(当然,这三个命令也可以单独使用),就拿myhead来说,它的调用形式只有如下四种形式:****|myhead3|****myhead3****|myhead3myhead3|****对于此,设置两个标记LeftMycatPipeFlag、LeftMysortPipeFlag用来记录myhead命令前面是否出现了管道,同时设置标记islastcmd来记录myhead是否为最后一条子命令。这样就可以通过这三个标志来分情况处理。具体设计实现见代码:对于命令“mysort|myhead6|mycat–n”来说:LeftMycatPipeFlag=find_left_mycat_pipe();LeftMycatPipeFlag=find_left_mycat_pipe();LeftMysortPipeFlag=find_left_mysort_pipe();intexistence=LeftMycatPipeFlag||LeftMysortPipeFlag; // Judgetheexistenceofleftpipe if(existence==1&&islastcmd==0){//eg:mycat-n|myhead3|mysort //getdatafrompipe if(LeftMycatPipeFlag==1) get_left_mycat_pipe(); elseif(LeftMysortPipeFlag==1) get_left_mysort_pipe(); //createpipe,placedata create_myhead_pipe(); } elseif(existence==0&&islastcmd==1){//eg:myhead3 //processdata,thenprint process_file_print(); } elseif(existence==1&&islastcmd==1){//eg:mycat-n|myhead3 //getdatafrompipe,thenprint if(LeftMycatPipeFlag==1) get_left_mycat_pipe(); elseif(LeftMysortPipeFlag==1) get_left_mysort_pipe(); } elseif(existence==0&&islastcmd==0){//eg:myhead3|mycat-n //processdata,putintobuffer process_file_into_buffer(); //createpipe,placedata create_myhead_pipe(); }管道通信原理图如下所示:(5)shell各部分说明----------------------shell主控程序400行-------------------------对输入的命令进行处理,为各个命令创建进程,运行结束时终止进程----------------------myls展开指定目录200行----------------------使用格式:myls[dir]参数说明:若dir不为“.”,则展开dir,否则展开当前目录,显示文件创建时间、最后修改时间、大小等基本属性------------------mycat文本文件查看和连接400行-------------------使用格式:mycat[-n][file1file2……]参数说明:由1开始对所有输出的行数编号:-n--------------------myhead显示文档的开头300行--------------------使用格式:myheadnumberfilename参数说明:number为要显示的行数------------------------mysort排序300行--------------------------使用格式:mysort[file1file2……]参数说明:命令用于将所有文件内容按第一列来排序(若第一列相同,则看第二列……)-----------------------mycp复制文件150行------------------------使用格式:mycpsour_dirdes_dir参数说明:sour_dir为源目录,des_dir为新创建的目录。---------------mytime统计可执行文件执行时间100行-----------------使用格式:mytime参数说明:参数为一个可执行文件------------------------mysl错误提示400行-----------------------使用格式:mysl说明:在Linux系统中,ls命令是很常用的,经常会误写成sl,这时shell会显示一辆跑动的小火车,以此提示程序员。命令举例:(1)mycat-nfile1|myhead3将文件file1的内容加上行号后显示前3行(2)myhead3file1|mycat-n将文件file1的内容显示前3行后加上行号(注:上述两条命令的操作最终结果等价)(3)mysortfile1file2|mycat-n|myhead5将file1和file2的内容合并排序、加上行号、显示前5行(4)mycat-n把的内容加行标后输出(5)myhead2输出的前2行(6)mysort把的内容排序后输出(7)mytime显示的执行时间(8)mycpab将文件夹a的内容复制到文件夹b(9)myls.展开当前目录(10)mylsa展开指定目录a(11)mysl显示跑动的小火车五、实验收获与体会实验代码量达到了2300行,实现了简单shell,基本达到了要求。不过由于时间关系实验中还有很多缺陷和不足有待改进。谈兆年的心得体会:本次试验中,我负责shell整体框架的设计以及myhead、mysort、mycat三条管道命令的实现。在实验中,学习了很多关于UNIX和Windows的管道设计机制相关知识。实验中最大的挑战莫过于对于管道命令的各个字符串的处理,为此我特地设计了CMD结构体来分割管道命令,还有实验中需要处理诸多函数,函数相互调用的时候,接口设计十分重要。光是某些单个命令的设计实现就需要400行的代码量,可想而知,若是接口设计的不好,势必会给后续工作带来影响。尤其是对于命令所带的参数的处理尤其麻烦,还有为每个命令创建进程的时候,szCmdline所带的参数也是需要小心处理。本次实验无疑极大地提升了我的项目动手能力,一个星期持续不断的编程还是非常刺激的,这其中遇到的问题胜不胜数,比如说,服务器端创建pipe时,buffer缓冲区不能为空:若为空,则在创建pipe时调用的WriteFile()没有在pipe中写入任何数据,然后客户端和pipe建立连接后,企图调用ReadFile()获取pipe中的数据时,发现里面什么都没有,则ReadFile()调用失败。徐欣廷的心得体会:在这次大作业中,我负责完成myls命令,由于代码的实现过程比较简单,在Windows下就是对目录的读取过程,需要自己添加的内容就是对内容的转义。比方说文件日期,从FILETIME转换成可读的本地时间、文件长度的高32位和低32位的拼接等操作。 因为涉及到的进程数量比较多,所以在子进程的代码中,需要注意的就是对内存的控制,每次new操作的内存空间在不需要的时候要及时释放,否则会导致内存泄漏,产生严重的后果;其次,对于打开的文件句柄,需要及时关闭,否则经过多次调用之后可能会导致系统调用出现异常。经过本次实验,我掌握了很多操作系统方面的知识,在之后的实际应用中会带来极大的帮助。 杨知水的心得体会:在这最后一次课程设计中,在我们小组共同努力下完成了一个shell命令解释器的基本功能。我们在这次综合了几乎所有实验课知识的实验中收益颇丰,不仅巩固了之前几次实验的知识,而且学到了不少新的知识,比如对于管道通信的理解等等。对于整个实践课程,不仅培养了我们独立思考、动手操作以及合作编程的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。课程设计使

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论