抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

lab1

sleep

编写一个sleep用户程序,可以参考grep(grep.c)。

目标:

  • 熟悉lab架构:如何向xv6中插入自己编写的程序
  • 熟悉一个用户程序的编写流程
  • 熟悉编译系统之UPROGS
  • 熟悉xv6提供的库函数ulib.c

solution:

  • user/sleep.c

pingpong

编写一个pingpong用户程序:创建一对父子进程, 一个进程使用一读一写两个管道传递数据。父进程向子进程发送数据, children打印<pid>: received ping, 然后子进程向父进程发送数据,然后子进程退出。父进程接收,然后打印<pid>: received pong, 之后退出。

目标:

  • 熟悉pipe, fork, read, write等用法

primes

使用管道设计一个并发版的质数查找器: 算法

目标:

  • 进一步熟悉pipefork的使用
  • 了解文件描述符的控制
  • 只有当管道的两个方向fd[2]都关闭时才算关闭,子进程read才会返回0

错误:

1
2
3
4
5
6
7
8
9
if(pid == 0) {
while(read(fd[0], &num, 4)!=0) {}
} else {
write(fd[1], &num, 4);
close(fd[1]);
close(fd[2]);
int stat;
wait(&stat);
}

正确:

1
2
3
4
5
6
7
8
9
10
if(pid == 0) {
close(fd[1]);
while(read(fd[0], &num, 4)!=0) {}
} else {
write(fd[1], &num, 4);
close(fd[1]);
close(fd[2]);
int stat;
wait(&stat);
}

find

写一个find程序

目标:

  • 了解文件系统,至少目录/文件是怎么表示的struct dirent, struct stat
  • 了解文件系统如何读取的fstat, read(fd, &de, sizeof(de)) == sizeof(de)

TIPS:

  • 记得关闭文件描述符

xargs

实现一个xargs程序,xargs能将标准输入变为程序的命令行参数。如echo "1\n2" | xargs -n 1 echo line输出:

1
2
line 1
line 2

目标:

  • 搞清楚程序在操作系统中是如何产生,如何使用管道交互的
  • 搞清楚execfork的流程

Summary

Optional challenge exercises

TODO

评论