xv6 Lab (util)
Nowherechan 学徒

其实 util 和 syscall 在寒假时候就已经写完了,一直没有回过头来再作一些分析。恰逢今天更新一下博客,今晚时间也勉强还算充裕,于是打开代码,进行一波复盘。

整个 util 实验就是通过写一些用户程序来了解并且熟悉 xv6 的系统调用。

Boot xv6

没什么好说的。

sleep

写一个用户程序,代码放在 user/sleep.c,使用 sleep 系统调用来实现休眠对应的时间。
可以直接用 atoi 函数将输入的参数转化为整数类型。
代码

pingpong

写一个用户程序,要求产生一个子进程,子进程和父进程互发并且互读消息,使用 pipe 来进行进程间通信。
pipe 系统调用输入一个 int p[2],分配两个 fd,p[1] 用来写,p[0] 用来读。
代码

primes

输入一个整数 n,输出 2~n 的所有质数。

这里用创建新进程的方法来实现质数筛:第一个进程需要读所有的数,每个进程收到的第一个数一定是质数,然后将后续输入的每个数都模一遍这第一个数,整除就丢掉,不整除说明可能是质数,通过 pipe 扔给子进程。

但是子进程会继承所有祖宗进程开启的那些 fd,但是实际上很多它们是不需要的,因此要关掉,否则就会出现文件描述符不够用的情况。

实际上,作者好像是想通过这个例子来说明,多进程的设计并不仅仅是为了利用线程资源,也可以简化设计,让程序更优雅什么的。但是我做完之后其实感觉并不特别强烈,当时的确也是惊讶了一下:哦呀,还能这样的啊。当我讲给打 ACM 的同学听的时候,他说,啊好那所以呢,大约是:“So what?”(笑)。
代码

find

实现 find 的基本功能。
用一些文件系统的系统调用。
记得是个大模拟,写了好几个小时,大量参考 ls 的代码来着?
代码

xargs

实现一个 xargs。
实际上做这个 lab 的时候,大部分时间都用来看 xargs 的功能了(笑)。
简单来说就是将 xargs 的标准输入作为 xargs 要运行的那个程序的参数,我也不知道为什么我理解了那么久。
代码

 Comments
Comment plugin failed to load
Loading comment plugin