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

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1实验课题1:Linux命令解释程序设计与实现实验报告1实验内容及要求Linux命令解释程序功能设计要求:1)选取和设计实现一组内部命令(五条以上);2)外部命令执行采用直接调用exec系统调用的方式来实现;3)至少一条内部命令采用直接调用相应系统调用的方式来实现;4)系统环境变量(至少包括当前目录)支持;5)在Linux操作系统上启用(或替换原命令解释程序Shell)测试验证。2开发、运行及测试环境1)虚拟环境软件:OracleVMVirtualBox2)操作系统:OracleLinux6.53)编辑器:vim4)编译器:gcc3实验步骤采用c语言编写该Linux命令解释程序。首先包含unistd.h、sys/syscall.h等头文件以及完成各个功能的函数声明。主程序中利用循环结构完成不限次的命令提示符显示和命令输入,并判别输入的命令是否合法,是内部命令还是外部命令。将Linux命令解释程序的各个功能封装成函数,完成具体的命令执行处理。实现具体功能步骤如下。3.1采用间接调用实现的内部命令3.1.1显示指定目录下文件列表设计该命令关键词为“ls”,功能为用户输入该命令后,指定具体的目录路径,可显示在该目录下的文件列表,并将文件编号显示,格式为“file编号:文件名”,每行显示一个文件的文件名。如该过程中出现错误导致不能显示文件列表则输出具体错误提示。采用间接调用相应系统调用的方式将该功能完成后封装为voidlist_()函数。3.1.2显示当前路径设计该命令关键词为“pwd”,功能为用户输入该命令后,在下一行显示当前路径并回车换行。采用间接调用相应系统调用的方式将该功能完成后封装为voidpwd_()函数。3.1.3文件重命名2设计该命令关键词为“rename”,功能为用户输入该命令后,在下一行显示“pleaceinputtheoldfilename:”,用户需输入需要重命名的文件名,然后显示“pleaceinputthenewfilename:”,用户需输入该文件的新的文件名,即可完成对文件的重命名。完成后显示提示重命名工作失败或成功。采用间接调用相应系统调用的方式将该功能完成后封装为voidrename_()函数。3.1.4显示输入内容设计该命令关键词为“echo”,功能为用户输入该命令后,输入空格,然后输入需要显示的内容,即可在下一行显示上述用户希望输出的内容并回车换行。采用间接调用相应系统调用的方式将该功能完成后封装为voidecho_()函数。3.1.5使用帮助设计该命令关键词为“help”,功能为用户输入该命令后,然后显示本命令解释程序的合法命令及其具体的功能说明。采用间接调用相应系统调用的方式将该功能完成后封装为voidhelp_()函数。3.1.6退出程序设计该命令关键词为“exit”或“quit”,功能为用户输入该命令后,显示“thankyouforusing!bye~”,之后该命令解释程序(Shell)退出到Linux操作系统上的原命令解释程序Shell。采用间接调用相应系统调用的方式完成。因该功能代码较简单直接在主程序中实现并未封装为函数。3.1.7设置和初始化系统环境变量此处略,详见下文3.4系统环境变量支持中的说明。3.2采用直接调用的内部命令3.2.1文件拷贝设计该命令关键词为“copy”,功能为用户输入该命令后,然后显示“pleaceinputthefilenametobecopied:”,用户输入需要复制的文件的文件名,然后显示“pleaceinputthenewfilename:”,用户输入新拷贝文件的文件名,即可完成文件的拷贝。如该过程中出现错误导致文件拷贝不成功则输出具体错误提示。采用直接调用系统调用的方式将该功能完成后封装为voidcopy_()函数。3.3外部命令3.3.1显示环境变量设计该命令关键词为“env”,功能为用户输入该命令后,然后显示出所有的系统环境变量,每行显示一个。采用直接调用exec系统调用的方式将该功能完成后封装为intenviron_()函数。3.3.2显示当前一系列进程3设计该命令关键词为“jobs”,功能为用户输入该命令后,然后显示出当前一系列进程和子进程。采用直接调用exec系统调用的方式将该功能完成后封装为intjobs_()函数。3.4系统环境变量支持设计该命令关键词为“export”,功能为用户输入该命令后,输入需要设置的系统变量名称和变量值,格式为“[系统变量名称]=[系统变量值]”然后即可设置完成。采用间接调用相应系统调用的方式分别实现保存在本地用户变量中和保存在系统环境变量种,并分别封装为voidenv_store()和voidenv_export()函数。最后将上述功能函数完成后封装为voidexport_()函数。以上代码编写完成后,通过Linux操作系统中的gcc编译器编译后运行,验证是否运行成功,功能是否完善,是否存在错误或问题。返回上述步骤修改代码,直到测试验证通过。4关键数据结构和算法流程在主程序中的关键数据结构是字符数组,用于接收用户输入的命令。关键的算法结构是循环结构,利用死循环结构用户可以不限次输入命令供程序执行处理,直到用户输入退出的命令则退出该循环结构,程序退出。在循环结构中,输出系统命令提示符,提示用户输入。用户输入命令存入字符串数组后,将该命令与预设的命令依次比较是否符合某一个,则进入相应命令的处理过程。若均不符合则输出输入错误的提示,继续回到循环开头输出系统命令提示符等待下一次输入命令。4.1采用间接调用实现的内部命令4.1.1显示指定目录下文件列表关键数据结构是另一字符数组,用于接收用户在命令后输入的指定目录;结构体“structdirent*entry”,用于存储该目录下文件,包括文件名;变量DIR*olist用于存储打开目录函数的返回值,判别是否打开成功并读取该目录下文件。该命令是间接调用相应的系统调用实现的方式。关键算法是用户输入该命令和指定路径后,调用opendir()函数打开指定的目录。若返回值为空则打开失败,输出错误提示。利用循环结构调用readdir()函数读取该目录下文件,并依次输出文件序号和文件名。循环结束后,调用closedir()函数关闭该目录。若关闭失败则输出错误提示。4.1.2显示当前路径关键数据结构为字符型指针,用于指向当前路径。该命令是间接调用相应的系统调用实现的方式。关键算法是用户输入该命令后,调用getcwd()函数获取当前路径,由指针指向该空间,然后输出该路径。最后释放该指针空间。4.1.3文件重命名4关键数据结构为两个字符型数组,用于存储新文件名和旧文件名。该命令是间接调用相应的系统调用实现的方式。关键算法是用户输入该命令后,分别输入旧文件名和新文件名存入数组。调用rename()函数,将文件重命名。最后输出命名成功或失败的提示。4.1.4显示输入内容关键数据结构为字符型数组,用于存储用户除命令外输入的内容。该命令无需调用系统调用。关键算法是用户输入该命令后,将命令后的内容除空格外依次输出,最后输出换行即可。4.1.5使用帮助在该函数中输出定义好的命令和相应使用帮助即可。4.1.6退出程序输出用户提示,调用函数exit()退出程序即可。4.1.7设置和初始化系统环境变量此处略,详见下文4.4系统环境变量支持中的说明。4.2采用直接调用的内部命令4.2.1文件拷贝关键数据结构为三个字符型数组,用于存储需拷贝的文件的文件名和拷贝文件的文件名以及拷贝的部分文件内容。该命令是直接调用相应的系统调用实现的方式。关键算法是用户输入该命令以及需拷贝的文件的文件名和拷贝文件的文件名后,使用syscall()函数和系统调用号SYS_open,采用只读模式打开需要拷贝的文件,若打开失败输出相应提示。使用syscall()函数和系统调用号SYS_read,读取该文件的内容和字节数量,若读取失败输出相应提示。使用syscall()函数和系统调用号SYS_creat,采用读写模式创建拷贝的新文件,若创建失败输出相应提示。使用syscall()函数和系统调用号SYS_write,向新文件中写入读取的内容,若写入失败输出相应提示。使用syscall()函数和系统调用号SYS_close,分别关闭两个文件,若关闭失败则分别输出相应提示。若以上步骤均成功则最后输出相应拷贝成功提示。4.3外部命令4.3.1显示环境变量该命令是采用直接调用exec系统调用实现的方式。调用fork()函数生成子进程并返回pid,根据该值判断。如果出现错误,fork返回一个负值,此时打印错误信息并返回;在子进程中,fork返回0,此时调用execlp()命令参数为“env”,即可显示所有的系统环境变量;在父进程中,fork返回新创建子进程的进程ID,需调用wait()函数等待。4.3.2显示当前一系列进程5该命令是采用直接调用exec系统调用实现的方式。调用fork()函数生成子进程并返回pid,根据该值判断。如果出现错误,fork返回一个负值,此时打印错误信息并返回;在子进程中,fork返回0,此时调用execlp()命令参数为“pstree-p”,即可以树状图显示一系列子进程;在父进程中,fork返回新创建子进程的进程ID,需调用wait()函数等待。4.4系统环境变量支持关键数据结构为自定义的结构体,结构体内为两字符型数组,分别用于存储系统环境变量的名称和变量的值。该命令是间接调用相应的系统调用实现的方式。关键算法是用户输入该命令后和系统环境变量的设置后,调用setenv()函数设置该环境变量并设置为可复写的,方便后续修改该变量的值。同时,附加在本地变量中也保存了上述设置的系统环境变量。在存储变量的数组中保存上述系统环境变量即可。5编译运行测试结果编译运行自行实现的命令解释程序shell.o,显示出命令输入提示符“Qin”,提示用户输入命令,如图1所示。图15.1采用间接调用实现的内部命令5.1.1显示指定目录下文件列表用户输入命令ls后,指定具体的目录路径,可显示在该目录下的文件列表,并将文件编号显示,格式为“file编号:文件名”,每行显示一个文件的文件名,如图2所示。6图25.1.2显示当前路径用户输入命令pwd后,在下一行显示当前路径并回车换行。如图3所示。图35.1.3文件重命名用户输入该命令rename后,在下一行显示“pleaceinputtheoldfilename:”,用户需输入需要重命名的文件名,然后显示“pleaceinputthenewfilename:”,用户需输入该文件的新的文件名,即可完成对文件的重命名并显示成功提示。再次输出该目录下文件,可见文件已经重命名,如图4所示。7图45.1.4显示输入内容用户输入该命令echo后,输入空格,然后输入需要显示的内容,即可在下一行显示上述用户希望输出的内容并回车换行。如图5所示。图55.1.5使用帮助用户输入该命令help后,然后显示本命令解释程序的合法命令及其具体的功能说明。如图6所示。8图65.1.6退出程序用户输入该命令exit/quit后,显示“thankyouforusing!bye~”,之后该命令解释程序(Shell)退出到Linux操作系统上的原命令解释程序Shell。如图7所示。图75.1.7设置和初始化系统环境变量此处略,详见下文5.4系统环境变量支持中的说明。5.2采用直接调用的内部命令5.2.1文件拷贝用户输入该命令copy后,然后显示“pleaceinputthefilenametobecopied:”,用户输入需要复制的文件的文件名,然后显示“pleaceinputthenewfilename:”,用户输入新拷贝文件的文件名,即可完成文件的拷贝。再次输出该目录下文件,可见文件已经被拷贝,如图8所示。9图85.3外部命令5.3.1显示环境变量用户输入该命令environ后,然后显示出所有的系统环境变量,每行显示一个。部分输出结果如图9所示。10图95.3.2显示当前一系列进程用户输入该命令后,然后显示出当前一系列进

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功