6.s081 Lab:Xv6 and Unix utilities
Lab:Xv6 and Unix utilities
1.实验目的
进一步了解熟悉xv6和系统调用命令。
2.实验内容
1)为xv6实现UNIX程序sleep;sleep应该暂停一段用户指定的时间间隔。解决方案放在user/sleep.c文件中。
2)编写一个程序,它使用UNIX系统调用在两个进程之间通过一对管道“ping-pong”一个字节,每个方向一个。父进程通过向父进程parent_fd[1]写入一个字节来发送,子进程通过从父进程parent_fd[0]读取来接收。在从父进程接收到一个字节后,子进程用自己的字节响应,向child_fd[1]写入数据,然后由父进程读取。解决方案放在user/pingpong.c文件中。
3) 使用管道编写prime-siever的并发版本。这个想法源于Unix管道的发明者dougmcilroy。这一页中间的图片和周围的文字解释了如何做到这一点。解决方案放在user/primes.c文件中。
4)编写一个简单版本的Unix find程序:查找目录树中名称与字符串匹配的所有文件。解决方案放在user/find.c文件中。
5)编写一个简单版本的Unix xargs程序:从标准输入中读取行并为每一行运行一个命令,将该行作为命令的参数提供。解决方案放在user/xargs.c文件中。
3.实验步骤
3.1 sleep
1)进入util分支。
2)模仿学习user中其他的程序来编写sleep,并使用到了系统调用命令sleep。
3)修改Makefile文件,将我们编写的sleep加入进去。
4)编译启动,并执行命令,发现结果与网站展示相同,只是sleep了一下,成功。
3.2 pingpong
1)编写pingpong程序。
2)编写pingpong程序,根据提示使用了pipe、fork和read,故编写如下。
提示说道,父进程通过parent_fd向子进程发送一字节,然后子进程通过child_fd再写回自己的一字节给父进程。
3)修改Makefile文件,将我们编写的pingpong加入进去。
4)编译启动,并执行命令,发现与网站展示相同,成功。
3.3 primes
1)编写primes程序。
2)修改Makefile文件,将我们编写的primes加入进去。
3)编译启动,并执行命令,发现与网站展示相同,成功
3.4 find
1)根据提示,其中大部分程序都是在ls.c和grep.c中存在的,可以直接用来编写find程序。
2)修改Makefile文件,将我们编写的find加入进去。
3)编译启动,并执行命令,发现与网站展示相同,成功。
3.5 xargs
1)根据要求编写xargs程序,其中要求说道这个命令作用——是从标准输入读取并执行命令,例如题目中所提到的echo,显示一段文字。根据提示使用到了exec()和wait(),但是fork()这里感觉意义不大,所以没有使用,只用一个进程一个一个读就可以,遇到回车或空格就知道是下一个参数了。同时,提示还提到kernel/param.h中的MAXARG,进去看后是32,使用到了程序中。
2)修改Makefile文件,将我们编写的xargs加入进去。
3)编译启动,并执行命令,发现与网站展示相同,成功。注意make qemu之前先make clean。
4.实验结论与心得体会
这个实验是本次实习的开始,万事开头难,从第一个就感觉到了自己阅读和编写代码能力的下降,通过查阅实验指导书等资料,磕磕绊绊完成了该实验。通过本次实验,让我稍微了解了xv6和它的系统调用,希望自己能再接再厉,在接下来的实验中更进一步通过查阅资料学习来提升自己。