MIT6.S081
MIT6.S081 Fall 2020.
util lab
这一系列的任务就是教你去使用一些系统功能调用
根据任务书上一步一步来就好
lab代码及notes
前置知识
- 标准流
输入0,输出1,错误2
可以作为printf的第一个参数
- 命令行参数
argc:表示参数个数
argv:参数的内容,从下标1开始。是一个char数组,可以用atoi转换为整型
- 无名管道
- 创建int pipe[2];
- pipe[0]表示读,pipe[1]表示写
- 文件&目录
- open根据路径打开目录(文件),获取文件描述符
- fstat通过文件描述符获取文件描述结构体
- dirent可以从fd中read得到,用于描述目录信息
sleep
实现一个sleep功能(就是休眠一段时间然后继续执行),即在命令行(模拟器)中可以直接用sleep [time]的形式来调用
首先明确几个问题:
- 系统调用C接口是什么(/user/user.h),这里面就是所有能用的C语言库函数
- 系统调用接口的实现在哪里(/kernel/sysproc.c)
- 如何从用户态到内核态(/user/usys.S)
- 需要引入库文件kernel/types.h,里面定义了一些数据类型
sleep功能实现步骤:
- 接受命令行参数,了解argc和argv
- 调用sleep的c接口,由c接口进入内核态并进行系统调用
将sleep加入命令行调用:
- 创建user/sleep.c并实现功能
- Makefile的UPROGS中添加$U/_sleep\
Qemu模拟器使用
- make qemu启动
- 先按Ctrl+a,再按x退出
- make grade测试成绩
pingpong
主要知识为父子进程(fork)间的通信(pipe),实现pingpong功能:
- 父进程给子进程发送一个字节数据表示开始
- 子进程给父进程发送ping表示接受到了
- 父进程给子进程发送pong表示接受到了
- 结束两个进程
实现的主要思路:
- fork创建子进程,0表示子进程
- pipe创建无名管道,read和write读写
- getpid获取当前进程pid号
- close关闭管道,写管道关闭后读管道返回0
primes
实现一个pipeline,实现多进程质数筛
多进程质数筛的思路:
- 前一个进程向后一个进程发送所有可能为质数的数(2-35)
- 当前进程接受到的第一个数一定是质数,打印输出信息
- 当前进程接受到的数中能够整除第一个数的必定不是质数,其余的数可能是质数
- 所有进程等待其子进程运行结束后再结束
几个关键点:
- wait等待子进程结束
- 子进程去递归创建进程,然后筛选。直到最后一个进程退出(用is_fork判断是否有子进程)
- 注意关闭fd
find
实现一个find(find [dir] [file]),可以指定工作目录和文件名
- 主要是仿照ls的实现来写
- 遍历目录下的所有文件然后比较文件名即可
主要思路:
在ls的基础上增加一个递归操作(遇到目录继续查找)和一个判断操作(当前文件名和target)
- 打开目录文件(open)获取文件描述符fd
- fstat获取文件信息st,st.type描述文件类型
- 如果是文件,就判断文件名是否为target;否则继续递归查找
- 工具函数fmtname,用于在路径中取出文件名
xargs
实现xargs,可以将管道或标准输入(stdin)转化成命令行参数
例如
$ echo world | xargs echo hello
hello world
主要步骤:
- 创建一个新的二维字符数组args
- 现将原有的参数复制到args中(通过argc确定个数)
- 从标准流中读取,并按空格和换行划分,添加到args中