Lab1:util
Lab:https://pdos.csail.mit.edu/6.828/2021/labs/util.html
sleep
code
1 |
|
pingpong
code
建立两条管道使得父子进程之间可以进行双向通讯。(可以画一张进行理解)这里需要注意的就是端口的关闭时间。
1 |
|
primes(素数筛)
写这道题之前,我们先来理解一下这道题到底是让我们干什么。。机翻晦涩难懂。看了好几遍然后去看了看别人的代码才恍然大悟。
以下是Lab里对primes函数的描述:
Your goal is to use pipe
and fork
to set up the pipeline. The first process feeds the numbers 2 through 35 into the pipeline. For each prime number, you will arrange to create one process that reads from its left neighbor over a pipe and writes to its right neighbor over another pipe. Since xv6 has limited number of file descriptors and processes, the first process can stop at 35.
其实用下面的一张图就可以做个简单的解释
code
建立管道。第一个进程将数字2-35放入管道。对每个质数,创建一个进程,该进程通过管道从其左邻居读取数据,并通过另一个管道向其右邻居写入数据。这里的左右邻居指的就是父子进程。每遇到一个新的质数,就要建立新的进程,通过管道进行通讯。
使用wait等待子进程全部退出
1 |
|
find
结构体
dirent 结构体描述了关于目录项的信息
This is a structure type used to return information about directory entries.
1 | struct dirent { |
stat 结构体描述了一个文件的信息
struct stat is a system struct that is defined to store information about files.
1 | struct stat { |
dirent 只是对当前目录下的文件或者目录的一个简单存储(相当于ls)
stat则是对具体文件的项目信息(相当于使用ls-l)
目录是一个包含不同结构序列的文件!!
code
这个函数其实大部分的东西是和ls函数是差不多的。ls只是对当级目录以及其目录下的文件进行了一个筛查。
这里的find函数是要将当前的目录作为根目录对其下所有的文件进行一次遍历,找到你想要的文件所在位置。
所以这里的框架基本都可以直接套用ls函数,当查找到文件的时候直接进行比较,当找到目录的时候,在对他下的文件进行遍历,做同样的事情。这里我用了递归进行处理。找好base case(递归出口),以及他的位置就可以写出来啦。
1 |
|
xargs.c
在开始写这个函数之前。我们先来明确一下这些概念:
main
函数里的参数argc,argv[]是什么意思?- 管道符是什么?
- 标准输入输出的含义是什么?
- xargs要我们实现的究竟是什么?我们是如何将xargs搭配管道符(|)来使用的?
argc代表命令的参数个数,argv[]作为一个字符指针数组,指的是每个参数。
利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
标准输入输出并不是我们在c语言文件里使用的
printf
和scanf
,而是我们使用文件描述符对文件进行的write
和read
。(个人理解,如有疑虑,移步google)一般 linux 的输入主要有两类:一是参数输入,二是标准输入 这类包含 管道。
xargs
是这样一个命令,用来获取标准输入来给其他命令传递参数的。换句话说xargs
可以通过管道给后面的命令传递多个参数,而且不会被当成字符串。
1 | echo "hello word" | xargs echo bye |
管道符前面的标准输出会作为后面的标准输入,所以这条命令其实就是echo bye “hello world”。
code
了解了这些概念之后,这道题目其实就是要用管道符前面的标准输出作为管道符后的标准输入。这里的输出可能是字符串,也可能是使用了空格的参数。所以我们就需要有一个判断。
关于读取标准输入就可以直接使用read来读取。param二维数组存储的是我们要执行的命令。fork出的子进程执行param。
1 |
|