- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
shell实验报告
操作系统实验报告(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);
您可能关注的文档
- arm7学习知识点.doc
- Clonezilla再生龙备份系统分区详细教程.doc
- caxa常见问题解答与自学.doc
- cjt13型径向柱塞泵存在问题及改进方法.doc
- CNC车间故障保压恒压供水系统(我的论文)电工技师论文.doc
- confocal思考题答案.doc
- CPSC-CH-C1001-093邻苯二甲酸酯类测试作业指导书.doc
- CK6152数控机床液压系统设计--毕业设计.doc
- Citrixpvs基础实验手册.doc
- CPM2B操作手册.doc
- 2025年网络文学平台版权运营模式创新与版权保护体系构建.docx
- 数字藏品市场运营策略洞察:2025年市场风险与应对策略分析.docx
- 全球新能源汽车产业政策法规与市场前景白皮书.docx
- 工业互联网平台安全标准制定:安全防护与合规性监管策略.docx
- 剧本杀剧本创作审核标准2025年优化与行业自律.docx
- 2025年新能源电动巡逻车在城市安防中的应用对城市环境的影响分析.docx
- 全渠道零售案例精选:2025年行业创新实践报告.docx
- 2025年网约车司乘纠纷处理机制优化与行业可持续发展报告.docx
- 2025年宠物烘焙食品市场法规政策解读:合规经营与风险规避.docx
- 2025年宠物行业数据安全监管政策影响分析报告.docx
文档评论(0)