ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:58.11KB ,
资源ID:22997611      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22997611.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验课题1Linux命令解释程序设计与实现.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验课题1Linux命令解释程序设计与实现.docx

1、实验课题1Linux命令解释程序设计与实现实验课题 1:Linux 命令解释程序设计与实现实验报告1实验内容及要求Linux 命令解释程序功能设计要求:1)选取和设计实现一组内部命令(五条以上) ;2)外部命令执行采用直接调用 exec 系统调用的方式来实现;3)至少一条内部命令采用直接调用相应系统调用的方式来实现;4)系统环境变量(至少包括当前目录)支持;5)在 Linux 操作系统上启用(或替换原命令解释程序 Shell )测试验 证。2开发、运行及测试环境1)虚拟环境软件 : Oracle VM VirtualBox2)操作系统: Oracle Linux 6.53)编辑器: vim4)

2、编译器: gcc3实验步骤采用 c 语言编写该 Linux 命令解释程序。首先包含 unistd.h 、 sys/syscall.h 等头文件以及完成各个功能的函数声明。主程序中利用循环结 构完成不限次的命令提示符显示和命令输入,并判别输入的命令是否合法,是 内部命令还是外部命令。将 Linux 命令解释程序的各个功能封装成函数,完成 具体的命令执行处理。实现具体功能步骤如下。3.1采用间接调用实现的内部命令3.1.1显示指定目录下文件列表设计该命令关键词为“ ls ”, 功能为用户输入该命令后,指定具体的目录路 径,可显示在该目录下的文件列表,并将文件编号显示,格式为“ file 编号 文件

3、名”,每行显示一个文件的文件名。如该过程中出现错误导致不能显示文件 列表则输出具体错误提示。采用间接调用相应系统调用的方式将该功能完成后 封装为 void list_() 函数。3.1.2显示当前路径设计该命令关键词为“ pwd”, 功能为用户输入该命令后,在下一行显示当 前路径并回车换行。采用间接调用相应系统调用的方式将该功能完成后封装为 void pwd_() 函数。设计该命令关键词为“ rename”, 功能为用户输入该命令后,在下一行显示 “ pleace input the old file name: ”,用户需输入需要重命名的文件名,然后显示“ pleace input the

4、new file name: ”,用户需输入该文件的新的文件名,即可完成对文件的重命名。完成后显示提示重命名工作失败或成功。采用 间接调用相应系统调用的方式将该功能完成后封装为 void rename_() 函数。3.1.4显示输入内容设计该命令关键词为“ echo” , 功能为用户输入该命令后,输入空格,然后 输入需要显示的内容,即可在下一行显示上述用户希望输出的内容并回车换 行。采用间接调用相应系统调用的方式将该功能完成后封装为 void echo_() 函 数。3.1.5使用帮助设计该命令关键词为“ help ” , 功能为用户输入该命令后,然后显示本命令 解释程序的合法命令及其具体的功

5、能说明。采用间接调用相应系统调用的方式 将该功能完成后封装为 void help_() 函数。3.1.6退出程序设计该命令关键词为“ exit ”或“ quit ”, 功能为用户输入该命令后,显示 “ thank you for using! bye ”,之后该命令解释程序( Shell )退出到 Linux操作系统上的原命令解释程序 Shell 。采用间接调用相应系统调用的方式完 成。因该功能代码较简单直接在主程序中实现并未封装为函数。3.1.7设置和初始化系统环境变量此处略,详见下文 3.4 系统环境变量支持中的说明。3.2采用直接调用的内部命令3.2.1文件拷贝设计该命令关键词为“ co

6、py” , 功能为用户输入该命令后,然后显示 “ pleace input the file name to be copied: ”,用户输入需要复制的文件的文件名,然后显示“ pleace input the new file name: ”,用户输入新拷贝文件的文件名,即可完成文件的拷贝。如该过程中出现错误导致文件拷贝不成功 则输出具体错误提示。采用直接调用系统调用的方式将该功能完成后封装为 void copy_() 函数。3.3外部命令3.3.1显示环境变量设计该命令关键词为“ env”, 功能为用户输入该命令后,然后显示出所有 的系统环境变量,每行显示一个。采用直接调用 exec 系

7、统调用的方式将该功 能完成后封装为 int environ_() 函数。设计该命令关键词为“ jobs ”, 功能为用户输入该命令后,然后显示出当前 一系列进程和子进程。采用直接调用 exec 系统调用的方式将该功能完成后封 装为 int jobs_() 函数。3.4系统环境变量支持设计该命令关键词为“ export ”, 功能为用户输入该命令后,输入需要设置 的系统变量名称和变量值,格式为“ 系统变量名称 = 系统变量值 ”然后即可 设置完成。采用间接调用相应系统调用的方式分别实现保存在本地用户变量中 和保存在系统环境变量种,并分别封装为 void env_store() 和 void en

8、v_export() 函数。最后将上述功能函数完成后封装为 void export_() 函数。以上代码编写完成后,通过 Linux 操作系统中的 gcc 编译器编译后运行, 验证是否运行成功,功能是否完善,是否存在错误或问题。返回上述步骤修改 代码,直到测试验证通过。4关键数据结构和算法流程 在主程序中的关键数据结构是字符数组,用于接收用户输入的命令。关键 的算法结构是循环结构,利用死循环结构用户可以不限次输入命令供程序执行 处理,直到用户输入退出的命令则退出该循环结构,程序退出。在循环结构中,输出系统命令提示符,提示用户输入。用户输入命令存入 字符串数组后,将该命令与预设的命令依次比较是否

9、符合某一个,则进入相应 命令的处理过程。若均不符合则输出输入错误的提示,继续回到循环开头输出 系统命令提示符等待下一次输入命令。4.1采用间接调用实现的内部命令4.1.1显示指定目录下文件列表 关键数据结构是另一字符数组,用于接收用户在命令后输入的指定目录; 结构体“ struct dirent *entry ”, 用于存储该目录下文件,包括文件名;变量 DIR *olist 用于存储打开目录函数的返回值,判别是否打开成功并读取该目录 下文件。该命令是间接调用相应的系统调用实现的方式。关键算法是用户输入该命 令和指定路径后,调用 opendir() 函数打开指定的目录。若返回值为空则打开 失败

10、,输出错误提示。利用循环结构调用 readdir() 函数读取该目录下文件, 并依次输出文件序号和文件名。循环结束后,调用 closedir() 函数关闭该目 录。若关闭失败则输出错误提示。4.1.2显示当前路径 关键数据结构为字符型指针,用于指向当前路径。 该命令是间接调用相应的系统调用实现的方式。关键算法是用户输入该命令后,调用 getcwd() 函数获取当前路径,由指针指向该空间,然后输出该路 径。最后释放该指针空间。关键数据结构为两个字符型数组,用于存储新文件名和旧文件名。 该命令是间接调用相应的系统调用实现的方式。关键算法是用户输入该命 令后,分别输入旧文件名和新文件名存入数组。调用

11、 rename() 函数,将文件重 命名。最后输出命名成功或失败的提示。4.1.4显示输入内容关键数据结构为字符型数组,用于存储用户除命令外输入的内容。 该命令无需调用系统调用。关键算法是用户输入该命令后,将命令后的内 容除空格外依次输出,最后输出换行即可。4.1.5使用帮助在该函数中输出定义好的命令和相应使用帮助即可。4.1.6退出程序输出用户提示,调用函数 exit() 退出程序即可。4.1.7设置和初始化系统环境变量此处略,详见下文 4.4 系统环境变量支持中的说明。4.2采用直接调用的内部命令4.2.1文件拷贝关键数据结构为三个字符型数组,用于存储需拷贝的文件的文件名和拷贝 文件的文件

12、名以及拷贝的部分文件内容。该命令是直接调用相应的系统调用实现的方式。关键算法是用户输入该命 令以及需拷贝的文件的文件名和拷贝文件的文件名后,使用 syscall() 函数和 系统调用号 SYS_open,采用只读模式打开需要拷贝的文件,若打开失败输出相 应提示。使用 syscall() 函数和系统调用号 SYS_read,读取该文件的内容和字 节数量,若读取失败输出相应提示。使用 syscall() 函数和系统调用号 SYS_creat,采用读写模式创建拷贝的新文件,若创建失败输出相应提示。使用 syscall() 函数和系统调用号 SYS_write ,向新文件中写入读取的内容,若写入 失败

13、输出相应提示。使用 syscall() 函数和系统调用号 SYS_close,分别关闭两 个文件,若关闭失败则分别输出相应提示。若以上步骤均成功则最后输出相应 拷贝成功提示。4.3外部命令4.3.1显示环境变量该命令是采用直接调用 exec 系统调用实现的方式。调用 fork() 函数生成 子进程并返回 pid ,根据该值判断。如果出现错误, fork 返回一个负值,此时 打印错误信息并返回;在子进程中, fork 返回 0,此时调用 execlp() 命令参数 为“ env”, 即可显示所有的系统环境变量;在父进程中, fork 返回新创建子进 程的进程 ID,需调用 wait() 函数等待

14、。该命令是采用直接调用 exec 系统调用实现的方式。调用 fork() 函数生成 子进程并返回 pid ,根据该值判断。如果出现错误, fork 返回一个负值,此时 打印错误信息并返回;在子进程中, fork 返回 0,此时调用 execlp() 命令参数 为“ pstree -p ”, 即可以树状图显示一系列子进程;在父进程中, fork 返回新 创建子进程的进程 ID,需调用 wait() 函数等待。4.4系统环境变量支持关键数据结构为自定义的结构体,结构体内为两字符型数组,分别用于存 储系统环境变量的名称和变量的值。该命令是间接调用相应的系统调用实现的方式。关键算法是用户输入该命 令后

15、和系统环境变量的设置后,调用 setenv () 函数设置该环境变量并设置为 可复写的,方便后续修改该变量的值。同时,附加在本地变量中也保存了上述设置的系统环境变量。在存储变量 的数组中保存上述系统环境变量即可。5编译运行测试结果编译运行自行实现的命令解释程序 shell.o ,显示出命令输入提示符 Qin”,提示用户输入命令,如图 1 所示。图15.1 采用间接调用实现的内部命令5.1.1显示指定目录下文件列表用户输入命令 ls 后,指定具体的目录路径,可显示在该目录下的文件列 表,并将文件编号显示,格式为“ file 编号: 文件名”,每行显示一个文件的 文件名,如图 2 所示。图25.1

16、.2显示当前路径用户输入命令 pwd后,在下一行显示当前路径并回车换行。如图 3 所示。图35.1.3文件重命名用户输入该命令 rename后,在下一行显示“ pleace input the old file name:”,用户需输入需要重命名的文件名,然后显示“ pleace input the new file name: ”,用户需输入该文件的新的文件名,即可完成对文件的重命名并显 示成功提示。再次输出该目录下文件,可见文件已经重命名,如图 4 所示。图45.1.4显示输入内容用户输入该命令 echo 后,输入空格,然后输入需要显示的内容,即可在下 一行显示上述用户希望输出的内容并回车

17、换行。如图 5 所示。图55.1.5使用帮助用户输入该命令 help 后,然后显示本命令解释程序的合法命令及其具体的 功能说明。如图 6 所示。图65.1.6退出程序用户输入该命令 exit/quit 后,显示“ thank you for using! bye ”,之后该命令解释程序( Shell )退出到 Linux 操作系统上的原命令解释程序 Shell 。如图 7 所示。图75.1.7设置和初始化系统环境变量此处略,详见下文 5.4 系统环境变量支持中的说明5.2 采用直接调用的内部命令5.2.1文件拷贝用户输入该命令 copy 后,然后显示“ pleace input the fil

18、e name to be copied: ”,用户输入需要复制的文件的文件名,然后显示“ pleace input the new file name: ”,用户输入新拷贝文件的文件名,即可完成文件的拷贝。再次 输出该目录下文件,可见文件已经被拷贝,如图 8 所示。图85.3 外部命令5.3.1 显示环境变量用户输入该命令 environ 后,然后显示出所有的系统环境变量,每行显示 一个。部分输出结果如图 9 所示。5.3.2显示当前一系列进程 用户输入该命令后,然后显示出当前一系列进程和子进程。部分输出结果如图 10 所示。图 105.4系统环境变量支持用户输入该命令 export 后,然后

19、输入需要设置的系统环境变量和变量值, 格式为:“ 系统变量名称 = 系统变量值 ”,若该系统环境变量没有设置过,则 初始化该变量完成。例如下例中初始化某系统环境变量为“ test=9999 ”。初始 化完成后,使用“ env”命令查看结果,系统环境变量已经初始化,输出结果如 图 11 所示。若该系统环境变量为曾经设置过,则修改该变量完成。例如下例中设置系 统环境变量为“ test=998 ”。设置完成后,使用“ env”命令查看结果,系统环 境变量已经重新设置,输出结果如图 12 所示。 htoMTNA禽MgMblTERM-3EnlSHELLPspbJl 刍 HI STS 121.000 st

20、rlHICI-HEMT一盅 JGlrJflo wosQTDBt5 f bG4/u DI-DFkDW/rQobJOTIzFfJb6 4/q T+UW二 K1 u deSS HTTY*/d 霑/p 議占 use 冒 rgi-tLAIg 厂 0RS1J?chgr34 二 no!r 壬34八4畀3774益:03r?/t 耳0r3rJte “?Jar27耳17PATHb、UMmb64、qt3 :、uslvlocar#n: PWD、tg 厂 AMobeFUTUTFSH_A3KPASS=0usf 二 g*cc./apg5Mlvgnwnelssll 工 ISTCO/1K0 Lngn r e du p slAH

21、dHOMEQ冷、=黑47十乂二 b2SSH誥丁 劭 H_CON 址 EmNulgle 严 125LO 3O4G 14严16 严 LESSOPENJLAtwr-iniessp-ipF 审h 56sG1BR0KEN J= HLENPMESM1eabMgd03 V 国11n MftlHIJO-srtrtftErtMggaV *3HOS TNAMEn bel/lVLter 乔 xtmrmGHELLff-jrvbash HI5T5IET1000QTD 1亍5 r、二 bEtQT 3 3 olop 舀7TOQrQdzcsr、-Hbmtw弋亠右ude5l/lHITTV、de、p rvto smsAsrt厂

22、FCOLOWSMrTFdFtmlnMDr3严斗占口箱7 45?- w=44x2 - 5甲37:44不节0上 32;聶莒1八 31; tgNMp 7 dNdol ; 31;, g 村 m.汙占忙 31;* x ur丄 賈:OL mmooe m;nB.oQr3r.*FNQr3 上 /Kbmol ; w 5 :.*xpfn-ol二5;吐丁0T 35: U 工吕上 rr3!7.*百01:3 s:/Qgn=CQws; HP$Q!:3!T* GrulLsgl二穿 nfou3 5+:f2HQr735+;-k &r!?,QgK呂?01卑/311-0戸世6;-fl xJMJrsd-wvorw.JgxA-rs?兀

23、拾诂euE: K4IL. r /% 00=总 m s.mutrviibt4、QT3.3 jbn:vMr 二 Qcal、3trln-;U2 pwmpLAluG-enlusNTFL5SH_A$K P A5 Ts r、1 i b 鼻孟z、op m n s 0h=n 0mm s U1U 一 H&TcohJTROL”gnD&dup55HLC厂HlHOME合rfLOGWAMEAQCII: QTLIHHAJSrIihMtQTgAMfnpr. 5h 鎳 GJBROKE 厂 FT 厂EMA盂 wtf phftl 1 #3 17281251 eHvorsdnlunuHps国12以上功能均在在 Linux 操作系统

24、上启用并测试验证通过,暂未发现错误。6技术难点及解决方案1)初次接触 Linux 操作系统,对于原命令解释程序 shell 的命令等并不熟 悉。对于设计与实现基于 Linux 内核的命令解释程序( Shell )有一定 难度。需首先熟悉原命令解释程序 shell 的使用方法和原理,再自行实 现一个命令解释程序。2)外部命令执行采用直接调用 exec 系统调用的方式。 Exec 是一系列的 函数,包括 execl 、execlp 、 execle 、execv、execvp。具体使用哪个 来完成外部命令的功能,需要了解各个函数间的区别,联系和常用的用 法。3)系统环境变量支持的功能要求可以设置和

25、初始化系统环境变量,如何完 成该功能是一个难点。该功能试图利用外部命令,调用原命令解释程序 shell 的 export 命令实现,但未能实现。后利用内部命令的间接调用 系统调用的方式通过 setenv() 函数实现。7疑难解惑及经验教训1)内部命令和外部命令的区分:内部命令是命令解释程序直接解释执行 的;外部命令是其他可执行程序支持的。内部命令和外部命令的区分都 是对于自行实现的命令解释程序 shell ,而不是原 Linux 操作系统上的 命令解释程序 shell 。2)直接调用系统调用和间接调用系统调用:间接调用系统调用是用户进程 调用 C 语言函数库中的函数来调用系统调用;直接调用系统

26、调用是利用 syscall() 函数使用系统调用号来直接调用系统调用。8结论与体会本次 Linux 命令解释程序设计与实现实验成果总结如下:1) 设计和实现一组 内部命令一共 8 条 ,实现典型内部命令的处理功能,包 括: ls,pwd,copy,rename,echo,help,export,exit/quit ;2) 设计和实现 外部命令一共 2条,包括: jobs,env 。执行采用直接调用 exec 系统调用的方式来实现;3)一条内部命令 copy 采用直接调用相应系统调用的方式来实现 ,其他内 部命令采用间接调用相应系统调用的方式来实现;4)系统环境变量(至少包括当前目录)支持 ,通

27、过 export 命令功能实现 系统环境变量的设置和初始化;5)在 Linux 操作系统上启用并测试验证,未发现错误;6)命令提示符显示、命令辨别 (区分内部命令与外部命令及不同内部命 令)和执行处理;通过本次 Linux 命令解释程序设计与实现实验,本人对于初次实操接触的 Linux 操作系统有了初步的了解。特别是对于 Linux 操作系统的原命令解释程 序的操作和一些典型命令的使用有了一定掌握。通过对于 Linux 操作系统的原命令解释程序的学习,自行编写 C语言程序 设计实现自己的命令解释程序。在过程中,学习了 Linux 系统上的 C 语言编 辑、编译和与运行和具体一些 C 语言的头文

28、件和函数库中的函数。并且加深了 本人对于理论课程中讲解的内部命令和外部命令,系统直接调用和间接调用系 统调用等概念的理解。最终,本人自行实现了基于 Linux 内核的命令解释程序( Shell ),主要包 括系统环境变量的设置和初始化、系统命令提示符显示、命令辨别解析(区分 内部命令与外部命令及不同内部命令) 、典型内部命令等处理功能,并在 Linux 操作系统上测试验证通过。在实验报告内容中运行结果截图的适当位置中应有机融入了个人姓名、学 号、计算机系统信息等凸显个人标记特征的信息。9源程序文件及源码清单shell.c 文件源码如下:#includestdio.h#includestring

29、.h#includeunistd.h#includesys/types.h#includesys/stat.h#includesys/syscall.h#includestdlib.h#includedirent.h#includestddef.h#includefcntl.h#includemalloc.h#define buffsize 1024#define O_RDONLY 00#define O_RW 066void list_();void pwd_();void copy_();void rename_();void echo_();void help_();int jobs_();int environ_();void export_();void env_store(char command2);void env_export(char command2);struct val_structchar name50;char value50;int env_num=0;char *env_arrary256=0;extern char *environ;int main()char command100;while(1)printf(Qin );scanf(%s,command);if(strcmp(command,ls)=0) list_();els

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1