- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux简单的shell实现(附源代码)
Linux下Shell的实现说明文档
作业一实验要求:
Shell能够解析的语法为:
commandline := pipecommand | pipecommand commandline | empty
pipecommand := redirectcommand | pipecommand | redirectcommand
redirectcommand := command outfile |
command infile |
command infile outfile |
command outfile infile |
command
command := program | command argument
需求说明和分析:
本作业要求为实现一个类似于bash的shell。要求支持后台命令,管道,重定向这三个基本功能。并在此基础上,实现一些简单的内部命令,例如cd,pwd等等。
设计方案:
首先利用readline()函数读到用户输入的shell命令,采用一个数组来保存shell命令,数组有固定的大小。
在main()函数中根据字符串中是否存在 字符判断是否为后台进程。如果是后台命令则判断是否是多条指令,如果不是将分割后的命令传递给pipel()函数,如果是的话分割之后利用while循环将命令传递给pipel()函数。如果不是后台进程,需要用waitpid()函数等待子进程结束后父进程才继续。
在pipel()函数中,将shell命令根据 | 字符分割成一个个重定向命令,利用fork ()得到子进程,并完成管道的设置,然后对每个重定向命令调用redirect()函数(如果没有 |,则将整个shell命令调用redirect()函数)。
在redirect函数里面,根据有没有””,””来判断是否需要重定向。如果不需要重定向,就直接对参数列表调用execv(char *, char **)函数执行命令。如果需要重定向,进行相应的处理,再调用execv()函数。
3、储存结构
1、帮助文档的结构,方便Help命令的构建。
struct HELP_DOC {
char *usage[lengthOfBUILTIN_COMMANDS]; //用法
char *info[lengthOfBUILTIN_COMMANDS]; //介绍
};
2、后台命令管理链表的结构,用于jobs指令的后台储存。
typedef struct BACK_JOBS {
pid_t pid;//记录进程名的pid
char *cmd;
int status;//三种状态 0为DONE 1为RUNNING 2为STOPPED
}BACK_JOB;
3、History命令需要的数据的链表节点结构
typedef struct Node {
int id;
char cmd[100]; //储存每条打过的命令
struct Node *next;
} NODE;
4、shell基本功能的实现难点
1、管道的实现
管道输出核心代码为:
order = trim(strtok(cmd, |));
other = trim(strtok(NULL, ));
if (!other)
redirect(order);
else {
pipe(fd[0]);
if ((pid = fork()) == 0) {
close(fd[0]);
close(STD_OUT);
dup(fd[1]);
close(fd[1]);
redirect(order);
} else {
close(fd[1]);
close(STD_IN);
dup(fd[0]);
close(fd[0]);
waitpid(pid, status, 0);
pipel(other);
}}
关闭管道输入端,将标准输出重定向到管道输出,然后关闭管道输出。管道输入的核心代码也是类似的。
输入输出重定向
首先判断是否有输入输出重定向,用标志记录,我把类型分为6种,根据这六种不同的类型,进行不同的重定向的方法。
然后在以下核心代码中实现重定向,即把标准输入输出定向到指定的文件。
if (type == 4 || type == 5 || type == 6) {
if ((fd_out = creat(outfile, 0755)) == -1) {
fprintf(stderr, #error: redirec
您可能关注的文档
最近下载
- 2024年10月27日云南昭通市事业单位选调笔试真题及答案解析.doc VIP
- 讲义总结岩土工程勘察讲义.ppt VIP
- 非常规油气勘探开发地质风险评估.pdf
- 中职 图形图像处理(Photoshop CS5)PS(第7章)教学课件 高教版.ppt VIP
- 市政道路监理规划-范本.pdf VIP
- 2025海南省通信网络技术保障中心招聘事业编制人员12人(第1号)笔试模拟试题及答案解析.docx VIP
- 《飞机上应急医疗》课件——心肺复苏的流程.pptx VIP
- 中职 图形图像处理(Photoshop CS5)PS(第6章)教学课件 高教版.ppt VIP
- 抖音直播社区公约.pdf VIP
- 地质灾害治理工程施工技术规范 DB50_T 989-2020 重庆.pdf VIP
文档评论(0)