MIT6.S081-Util Lab

MIT6.S081

MIT6.S081 Fall 2020.

util lab

这一系列的任务就是教你去使用一些系统功能调用
根据任务书上一步一步来就好
lab代码及notes

前置知识

  • 标准流

输入0,输出1,错误2
可以作为printf的第一个参数

  • 命令行参数

argc:表示参数个数
argv:参数的内容,从下标1开始。是一个char数组,可以用atoi转换为整型

  • 无名管道
  1. 创建int pipe[2];
  2. pipe[0]表示读,pipe[1]表示写
  • 文件&目录
  1. open根据路径打开目录(文件),获取文件描述符
  2. fstat通过文件描述符获取文件描述结构体
  3. dirent可以从fd中read得到,用于描述目录信息

sleep

实现一个sleep功能(就是休眠一段时间然后继续执行),即在命令行(模拟器)中可以直接用sleep [time]的形式来调用

首先明确几个问题:

  1. 系统调用C接口是什么(/user/user.h),这里面就是所有能用的C语言库函数
  2. 系统调用接口的实现在哪里(/kernel/sysproc.c)
  3. 如何从用户态到内核态(/user/usys.S)
  4. 需要引入库文件kernel/types.h,里面定义了一些数据类型

sleep功能实现步骤:

  1. 接受命令行参数,了解argc和argv
  2. 调用sleep的c接口,由c接口进入内核态并进行系统调用

将sleep加入命令行调用:

  1. 创建user/sleep.c并实现功能
  2. Makefile的UPROGS中添加$U/_sleep\

Qemu模拟器使用

  1. make qemu启动
  2. 先按Ctrl+a,再按x退出
  3. make grade测试成绩

pingpong

主要知识为父子进程(fork)间的通信(pipe),实现pingpong功能:

  1. 父进程给子进程发送一个字节数据表示开始
  2. 子进程给父进程发送ping表示接受到了
  3. 父进程给子进程发送pong表示接受到了
  4. 结束两个进程

实现的主要思路:

  1. fork创建子进程,0表示子进程
  2. pipe创建无名管道,read和write读写
  3. getpid获取当前进程pid号
  4. close关闭管道,写管道关闭后读管道返回0

primes

实现一个pipeline,实现多进程质数筛

多进程质数筛的思路:

  1. 前一个进程向后一个进程发送所有可能为质数的数(2-35)
  2. 当前进程接受到的第一个数一定是质数,打印输出信息
  3. 当前进程接受到的数中能够整除第一个数的必定不是质数,其余的数可能是质数
  4. 所有进程等待其子进程运行结束后再结束

几个关键点:

  1. wait等待子进程结束
  2. 子进程去递归创建进程,然后筛选。直到最后一个进程退出(用is_fork判断是否有子进程)
  3. 注意关闭fd

find

实现一个find(find [dir] [file]),可以指定工作目录和文件名

  1. 主要是仿照ls的实现来写
  2. 遍历目录下的所有文件然后比较文件名即可

主要思路:
在ls的基础上增加一个递归操作(遇到目录继续查找)和一个判断操作(当前文件名和target)

  1. 打开目录文件(open)获取文件描述符fd
  2. fstat获取文件信息st,st.type描述文件类型
  3. 如果是文件,就判断文件名是否为target;否则继续递归查找
  4. 工具函数fmtname,用于在路径中取出文件名

xargs

实现xargs,可以将管道或标准输入(stdin)转化成命令行参数

例如
$ echo world | xargs echo hello
hello world

主要步骤:

  1. 创建一个新的二维字符数组args
  2. 现将原有的参数复制到args中(通过argc确定个数)
  3. 从标准流中读取,并按空格和换行划分,添加到args中
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值