全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
前面已经学习了很多基本的函数实现,也进行了这个shell例程中的很多函数接口的分析。这样,继续进行命令运行的处理就非常容易了。
首先,我们得意识到我们实现的这些命令只是为了实现一个已有功能的包装而已。这样的实现,是通过之前看过的exec系列函数来实现的。而之前看过的命令解析,也基本让我们知道了整个解析的过程。因此,接下来只需要拼接一下这个实现部分。
上面是实现的代码,我参考了一些网上其他人的实现方案。而这里做的一点小修整是exe_path我是直接定义了一个数组,并且限制了大小。这样的好处是之前看到的缓冲区溢出应该可以得到一定的监控,最起码保证有一定的缓冲区可以用。再者,需要注意到的是这个是测试的实现,文件的名称加上目录信息是有一个长度限制的。
这里执行可执行程序的时候用了v结束的,这样比较便于进行一个数组的传递。为什么使用这个而不是用execl等函数接口呢?这个其实还得去看之前的命令解析部分,在这个命令解析的过程中其实是进行了参数的数组化的。而在这个处理的过程中,也在数组的最后部分增加了一个结束符。
其实关于结束符的处理,之前我在看代码的时候还是看到了的,只是当时我并不是很清楚exec这一组函数,因此没有看明白这其中的意图。现在结合这一组函数的功能介绍,这个设计也就很容易理解了。
这个是关于ls实现的一个测试,从输出的字体颜色其实能够看得出来这个其实是两个环境的执行结果。而6.828的这个输出其实也是很好的提示效果。为了测试,还测试了一个lss这个不存在的命令。后面还会继续实现一下重定向等其他的功能。
至于这个6.828为什么每次都出现,或者说为什么每次执行完一个命令就会出现一次。这个主要是在main中的while循环中实现的,这个输出绑定了命令的获取动作。
这个是之前的main函数的实现,这里有一个获取命令输出6.828的动作。而这里的wait,主要作用是为了等待子进程的死去。
上面的测试例子中,只是测试了一个ls,其实这样的组合过程适用于任何存放在/usr/bin目录下的可执行文件。如此,假如要实现整个HW中需要测试的例子,还得进一步实现管道命令。