Shell项目:命令解析器

命令解析器:

       提示信息:运行自己的Shell时,首先会像系统shell一样,输出一段提示信息,

从左到右依次是:登陆时的用户名,主机信息,和当前目录。

       我们定义一个函数Put Flag()来实现,

这里涉及到几个大家可能不太熟悉的函数和结构体

  

切割命令(识别命令):

输出了提示信息后,用户就要输入他想执行的命令了,那我们如何来识别用户输入的命令呢,又是怎样识别用户输入的是参数还是命令呢,这里我们实现一个CutCmd函数,顾名思义就是切割命令。

这里strtok函数就是用来切割命令的函数,也是该函数的核心。第一次调用时必须将要切割的字符串cmd传进去,以空格为切割标记,细心的同学可能会发现在下面while循环中strtok函数的参数传了一个NULL,这和strtok函数的实现机制有关。strtok()在参数cmd的字符串中发现第二个参数中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数cmd字符串,往后的调用则将参数cmd设置成NULL。每次调用成功则返回指向被分割出片段的指针cmd为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。

到这里我们的准备工作差不多已经完善了,接下来就到了根据用户输入的命令去执行相关可执行文件的时候了

进程替换和子进程:

       当用户输入命令后,我们要根据用户输入的命令去选择相应的可执行文件来实现该命令,这里会用到一个exec函数,它实现了一个进程替换的功能,就是把当前进程的代码从调用该函数处替换成另外一个文件,而进程号不变,在系统的终端程序中,一个命令执行完之后又会回到命令解析器中,也就是说命令解析器的主程序应该是一个死循环,但是如果调用exec函数替换进程之后,这个死循环就会退出,也就是说我们这个终端每次执行一个命令就要重新启动一次,显然与系统终端有很大差别,为了消除这一差异,我们在这里使用fork函数产生一个子进程,然后把进程替换实现在子进程中,这样,每执行完一个命令,子进程结束,又会回到父进程的命令解析器的死循环中。

这里用红色下划线标注的是两个不能在子进程中实现的命令,一个是exit,退出终端的命令,执行此命令后,终端程序结束,终端退出。还有一个是cd命令,切换当前目录,如果在子进程中实现,当前目录切换之后子进程结束,又会回到当前目录,因此cd命令应该实现在父进程中。我们封装了一个函数来实现cd命令

命令解析器基本就是这些内容,接下来就是各个命令的具体实现了。

猜你喜欢

转载自blog.csdn.net/Mr_H9527/article/details/82722544
今日推荐