1648_MIT 6.828 shell例程中调用系统命令的实现
创始人
2025-06-01 04:39:33
0

         全部学习汇总: 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中需要测试的例子,还得进一步实现管道命令。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...