6.S081-Lab 1 Xv6 and Unix utilities
前言
6.S081是MIT的一门操作系统课,这门课程使用一个简化的 Unix-like 系统 xv6 为例进行讲解,该课程主要作业是一系列的Lab,本篇博客记录第一个 Lab:Xv6 and Unix utilities。这次 Lab的主要内容是编写一些简化版本的小程序,这些小程序通过调用内核提供的系统调用来完成功能。Lab链接:https://pdos.csail.mit.edu/6.828/2021/labs/util.html
sleep
比较简单,直接调用系统调用sleep即可AC。
1 | /** |
pingpong
通过fork系统调用创建一个子进程,并通过管道实现两个父子进程之间的双向通信。
这里需要注意的是,管道中的数据是“无主数据”,一个进程写进管道中的数据可能被它自己再次读出来,所以需要创建两个独立的管道;还有就是及时将不需要使用的管道端关闭。
1 | /** |
primes
创建一系列的进程,父子进程之间通过管道进行通信,以此实现质数过滤的效果。第一个进程将2-35通过管道送入子进程,子进程打印第一个2,然后将管道中剩余数中能被2整除的丢弃,剩余的数通过管道送入它自己的子进程,如此递归。
做这道题的时候一定要记得将不使用的管道及时关闭,不然可能会出现两个问题:
- 文件描述符fd不够用。
- 管道输入端不关闭时,输出端使用
read
读取时会阻塞不返回,程序就死在了某处。
1 | /** |
find
这道题是要求实现一个简易版本的find命令,思路也是比较简单,递归的遍历目录中的子文件或子目录,可以参考ls.c
文件来实现。需要注意细节问题,也就是关于.
和..
目录的处理,遍历遇到这两个目录时不要进去,不然会无穷递归。
1 | /** |
xargs
实现一个简化版本的xargs,xargs从标准输入中读取多行数据,每行数据作为后续命令的参数,通常配合管道使用,便于将上一个命令的输出作为后一个命令的参数,例如:
1 | $ echo hello | xargs echo bye |
实现的思路是通过对标准输入中的字符进行判断,如果是\n
则通过fork
和exec
系统调用来执行一次命令,等到子进程执行完之后继续读标准输入。
1 | /** |
测试结果
2021/5/29测试通过:
1 | make grade |