综合性、设计性实验项目-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!
认定意见 教学系认定意见:
教学系负责人(签字):
年 月 日 学院认定意见:
分管院长(签字):
年 月 日