全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
继续看这个shell例程的分析,现在从最初的有点茫然到现在基本能够看清楚数据处理的流程了。这一次,分析一下parseexec函数的实现。
这里前面两行代码其实就是一个等价转换,不处理都是可以的。而接下来的重定向处理,则是判断命令是否有重定向的动作,并且进行了命令的转换。
1. while的条件中,peek只是修剪空白不会改变其他的信息。这里通过peek来修剪空白的同时判断了是否有管道命令。如果没有管道命令,下面才会执行循环体。从另一个角度思考,其实管道命令会决定命令处理的一个信息区间段。
2. 在第一次gettoken执行的时候,如果发现字符串已经处理完了,那么直接退出。
3. 如果没有到字符串的最后,那么接下来应该会取出来了一段参数。因为进入循环之前已经重定向处理了,因此这里已经没了重定向符号。而这个逻辑跳过了管道符号,又执行了一次gettoken的调用,会把接下来的一段参数字符串取出来。因此,这里算是做了一个防御式的编程判断。
4. 在第3步的处理中,参数的字符串范围已经取出来了,在接下来的参数处理中通过mkcopy函数进行了字符串内容的复刻。这样,相应的参数在堆栈中新开辟的内存空间中存储。
5. 参数的个数有一定的数目现在,在这里数目限制为10个。
6. 由于命令是可以级联的,而参数本身也可能存在多个。因此,循环结构的存在是需要解决这样的问题的。在结束之后,进行了新的重定向的处理。
7. 当所有的参数全都解析完成之后,最后增加了一个参数0作为处理的结束信息。这样的处理类似于字符串的结束方式。
这样,这个函数的分析就基本结束了。刚刚回退了一下,看了下之前没有解析完的代码设计发现还是少一些其他的代码解析。后面需要补充完才能够完成回溯的解读,这样,等待以后开启新的代码分析了。
上一篇:蓝桥复习2
下一篇:k8s 1.18.20版本部署