shell实验报告.doc
文本预览下载声明
操作系统实验报告(shell命令解释器)
目录
1 功能描述 2
2 主要数据结构 2
3 主要自定义函数功能及接口说明 3
4 主要功能实现方法和系统调用 4
4.1 重定向功能 4
4.2 多管道功能 4
4.3 命令的后台运行 5
4.4 历史命令 6
4.5 cd命令 6
4.6 其他简单命令 6
4.7 其他自定义命令 6
5 心得体会 6
6 源代码 7
功能描述
(用红色标示的字体显示了本解释器完成的基本功能)
本实验完成了一个shell命令解释器,实现了shell的解释命令功能,实现了重定向功能和多管道、后台运行等功能。具体功能描述如下:
1)解释器的命令格式为
cmd1[infileName][|cmd2][|cmd3]…[|cmdn][oroutfileName][]
2)cmdi为命令名+参数形式的命令,为输入重定向,后跟输入重定向文件名infileName;或后跟输出重定向文件名,输出内容将写入outfileName,
表示以追加方式写入文件,则表示以覆盖方式写入;
3)实现了多管道
4)命令结尾可加后台运行符号 ,表示此命令将以后台运行的方式执行
5)实现了cd命令
6)exit为退出命令
7)history为历史命令,可以显示最近执行的命令,最多100条
8)!i为执行历史命令,意为执行第i条历史命令。!!为执行上一条命令。
9)’|’为管道符号,使用|符号隔开的若干条命令之间,前一条命令的输出是后一条命令的输入。
10)自定义命令myname,将输出此Shell的版本信息
11)本解释器命令格式中的简单命令可为所有外部命令和一部分内部命令和自定义命令
主要数据结构
本shell解释器实现手法上非常直观易懂,没有用到复杂的数据结构。运行过程中大部分数据采用字符数组的形式存储。
其中定义了命令结构类型cmd,用以表示一条简单命令。结构定义如下:
struct cmd{
int infd; //输入文件
int outfd; //输出文件
char* av[MAXARG]; //命令名+参数
}; //命令结构
这主要是为了实现多条命令的管道功能而引入的cmd结构中infd表示此命令的输入文件,outfd表示此命令的输出文件,av数组中以命令名+参数的形式存储了整个命令。将命令定义为这样一个结构的好处就是实现管道时只需在分别执行单条命令时改变它的输入和输出文件infd和outfd即可。
程序中还定义了如下全局变量:
int hisNum=0; //已存储的历史命令条数,初始化为0
int lastpid; //执行多管道时保存最后一个子进程的id号
int backgnd; //后台运行标志,说明此次执行命令是否以后台执行的方式运行
char *lineptr;
char *avptr;
char infile[MAXNAME+1];
char outfile[MAXNAME+1];
char avline[MAXLINE+1];
char line[MAXLINE+1];
int append; //文件写入方式标志,说明重定向写入目标文件时以覆盖或追加方式写入
char curdir[MAXDIR]; //保存当前目录
其他更详细的变量说明可参见源程序的注释。程序中定义的主要函数都是对以上变量进行操作和处理。
主要自定义函数功能及接口说明
本程序实现中的主要函数及其说明如下所示:
void initial();
//初始化各个变量
int getinline();
//获取输入命令行字符串,存储到line[]中
void addCmd(struct cmd newCmd);
//添加历史命令记录。将命令newCmd添加到历史纪录中
void printHistory();
//在屏幕上输出所有以记录的历史命令
void command(int i);
//将line[]中第i个命令以命令名+参数的形式存储到cmdlin[i]中
void execute(int i);
//执行cmdlin[0]到cmdlin[j-1]中的命令(调用forkexec()),同时创建管道逐个处理多管道的执行
void forkexec(struct cmd* ptr);
显示全部