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 1、需求说明和分析: 本作业要求为实现一个类似于 bash 的shell。要求支持后台命令,管道,重定向这三个基本功能。并在此基础上,实现一些简单的内部命令,例如 cd,pwd 等等。 2、设计方案: 1、 首先利用 readline()函数读到用户输入的shell 命令,采用一个数组来保存 shell命令,数组有固定的大小。 2、 在 main()函数中根据字符串中是否存在 "&" 字符判断是否为后台进程。如果是后台命令则判断是否是多条指令,如果不是将分割后的命令传递给 pipel()函数,如果是的话分割之后利用 while 循环将命令传递给 pipel()函数。如果不是后台进程,需要用 waitpid()函数等待子进程结束后父进程才继续。 3、在 pipel()函数中,将 shell 命令根据 "|" 字符分割成一个个重定向命令,利用 fork ()得到子进程,并完成管道的设置,然后对每个重定向命令调用 redirect()函数(如果没有 "|",则将整个 shell 命令调用 redirect()函数)。 4、在 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、s hell 基...