综合性、设计性实验项目-Linux高级编程-蒋剑

  • 格式:doc
  • 大小:50.00 KB
  • 文档页数:3

江西财经大学综合性、设计性实验项目申报表

中心/ M103 实验室 填表时间: 2016年9月1日

课程名称 Linux高级编程 实验室名称 M103 计划学时 48

实验项目名称 模拟命令解释器Myshell的设计与实现

项目性质 综合性实验□、设计性实验√ 指导教师 蒋剑

项目目的与要求

一、实验目的

Linux/UNIX系统中,shell是用户和系统内核沟通的中介,它为用户使用操作系统的服务提供了一个命令界面。用户在命令提示符($或是#)下输入的每一个命令都由shell解释,然后传给内核执行。本实验要求用C语言编写一个模拟shell命令解释器,达到如下目的:

 用C语言编写清晰易读、设计优良的程序;

 在编写系统应用程序时熟练使用man手册或其他查询命令、系统调用和库函数的工具。

 学习使用文件操作、进程控制、信号、管道相关程序设计方法和系统调用;

 锻炼团队成员之间的交流和合作完成项目能力。

二、实验要求

设计并实现一个Linux下的的交互式shell命令解释器:MyShell;以模拟unix/linux系统下的完善的bash shell的功能。不需要具备非常完备的shell功能。主要有如下功能:

 初始化环境,主要是默认搜索路径、history循环数组、作业列表

 打印命令提示符;

 接受、识别和分析命令提示符后输入的命令行,并创建子程序,在子程序中将其转换为相对的系统调用以调用内核功能实现任务;

 能实现内部命令,包括:exit(退出shell)、history、cd、jobs、bg、fg。

 能够执行外部命令,并到搜索路径中去查找外部命令对应的执行文件;命令均可带参数;

 支持&、|、<、>四个特殊字符及其所代表的功能;

 支持前、后台作业控制,包括fg/bg/jobs以及ctrl+c/ctrl+z(挂起、中止和继续运行)。

 最后用make来建立工程;

 不断测试

 写报告,提供清晰、详细的解决方案和设计文档。

 结束

实验过程中,要求学生3~4人一组,要求各小组内部对该实验任务加以分工,各小组之间相互独立完成实验。教师根据各小组所编写的程序代码以及实现功能加以评分,如能完成实验要求的基本功能,则予以通过和合格成绩;如能在实现的简洁度和清晰度上做出优化,则加分;如能实现更完善功能,则给以优良分数。

3.实验要求说明:

 读取test_profile文件中的默认搜索路径列表,作为环境。

 打印命令提示符:

模仿bash shell的命令提示符,要求打印出形式为“当前用户名@当前目录名>”形式的命令提示符;涉及到的函数有:

getlogin()

get_current_dir_name()或getcwd(),注意get_current_dir_name()返回值类型。

 接受、识别和分析命令提示符后输入的命令行,并将其转换为相对的系统调用以调用内核功能实现任务:

 能提取命令字符串;

 能识别&、|、<、>四个特殊字符,并调用相应的功能。(追加功能:实现追加重定向>>的功能)

 命令按enter键才能确认;空命令不产生任何操作,重新打印命令提示符。

 命令解释器能够处理命令行前后无用的重复空格。

 能实现内部命令:

exit:结束所有子进程并退出命令解释器。

cd:涉及函数chdir();

jobs:作业号按进入作业队列顺序编为1、2、„„

history:显示历史命令记录,此处定义最多10条

fg %<作业号>

bg %<作业号>

 实现外部命令

 若外部命令或其他可执行文件(比如ls)在文件test_profile中所指定的路径中,必须能找到;

 追加功能:(a)能执行诸如“/tmp/aaa”之类的绝对路径,(b)能执行当前路径下的可执行文件。

 作业控制, ctrl+c/ctrl+z;fg/bg/jobs

 ctrl+c/ctrl+z将中止/暂停前台进程,但不会对命令解释器产生影响。

 注意SIGTSTP、SIGSTOP、SIGCONT、SIGINT

 程序结构和其他注意事项:

见“综合实验说明.ppt”。

 程序框架:

见“test_shell.c”

 注意点:

 这个大程序中,如果某些功能是重复使用的,需要为其编写一个函数模块,以方便反复调用;

 注意在头文件中定义一些全局变量,来方便函数间的数据共享。

 同组同学可以在制定了程序的总体框架后,按功能模块分工。

预计实验效果  要求实验结果如下:

[root@localhost 2010_test]# gcc shellx.c

[root@localhost 2010_test]# ./a.out

jiangjian@/tmp/2010_test> ls

a.out makefile readme.txt ysh2.c ysh3.c ysh.c ysh.h ysh_profile

jiangjian@/tmp/2010_test> cd /tmp

jiangjian@/tmp> cd /tmp/2010_test

jiangjian@/tmp/2010_test> exit

Bye bye!

jiangjian@/tmp/2010_test> cp dead1 /bin

jiangjian@/tmp/2010_test> cp dead2 /bin

jiangjian@/tmp/2010_test>dead2

[2] stopped ./dead2 //此处按了ctrl+z

jiangjian@/tmp/2010_test> jobs

1 2026 stopped ./dead2

jiangjian@/tmp/2010_test> dead1&

1 2026 stopped ./dead2

2 2029 running dead1&

jiangjian@/tmp/2010_test> fg

[1] running dead1&

jiangjian@/tmp/2010_test> bg

jiangjian@/tmp/2010_test> jobs

1 2032 running ./dead2

2 2035 running dead1&

jiangjian@/tmp/2010_test> ls>aaa

jiangjian@/tmp/2010_test> ls

aaa a.out dead1 dead1.c dead2 makefile readme.txt ysh2.c ysh3.c ysh.c ysh.h

ysh_profile

jiangjian@/tmp/2010_test> ls -l|more

\x{603B}\x{7528}\x{91CF} 140

-rw------- 1 root root 88 10\x{6708} 23 01:43 aaa

-rwxr-xr-x 1 root root 22331 10\x{6708} 23 01:35 a.out

-rwxr-xr-x 1 root root 11420 10\x{6708} 23 01:38 dead1

-rw-r--r-- 1 root root 46 10\x{6708} 23 01:38 dead1.c

-rwxr-xr-x 1 root root 11420 10\x{6708} 23 01:38 dead2

-rwxr-xr-x 1 root root 28 10\x{6708} 23 01:34 makefile

jiangjian@/tmp/2010_test> exit

Bye bye!

认定意见 教学系认定意见:

教学系负责人(签字):

年 月 日 学院认定意见:

分管院长(签字):

年 月 日