Featured image of post 北航OS Lab0 上机

北航OS Lab0 上机

诶woc你怎么这么难啊

exam

不错的exam。考核内容完全来自于指导书与作业,并且足够全面。
这在lab上机中是很好的设计,掌握不那么牢固的可以通过花费一点时间阅读指导书拿到exam这一主要分数,提升掌握水平
而相对熟练的同学则可以更快地解决exam去攻克extra了。

另外,一定要认真读前言里的要求!本次exam题就需要先bash init.sh才能得到所需文件

题目有两道:Makefile与Shell

Makefile

Makefile考的仍然是gcc,run和clean三件套

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
.PHONY: clean
all: check.o
	make check
	gcc -I ./src/include ./src/main.c ./src/output.c -o ./out/main
check: check.c
	gcc -c check.o check.c
run: out/main
	./out/main
clean:
	rm -rf check.o
	rm -rf ./out/main

不过这次在gcc上的考点比较新:

  1. 编译不链接 gcc -c
  2. 非标准库头文件 gcc -I 头文件目录

此外,还考查了make A任务内调用make B的内容

也可以考察跨目录make调用
即 cd 目录 && make

Shell

本题一共有九问,也就是九个功能,
比较惹人烦的点在于这九个功能要在9个脚本中分别实现

如果你足够熟悉,
你可以直接 sed -i '1i#!/bin/bash' exam_*.sh 来为每一行开头加上#!/bin/bash

九个脚本的内容是:

  1. 在指定目录下新建目录
  2. grep指令
  3. mv指令
  4. cp -r指令
  5. 循环语句与sed 替换
  6. 通配符*
  7. chmod
  8. 条件语句

需要注意的一些点:

  1. 双引号,单引号
    取决你是否要解析引号内的内容

    对于awk中$1有特殊含义,便需要单引号处理

    而sed中如果需要$1参数,那当然是要用双引号的

  2. $符号作为尾行,又是参数解析符号,若要从$1到$进行p,如果写成sed -n ‘$1,$p’的话,$1不能解析;写成sed -n “$1,$p"的话,p又会被解析。
    那么我们可以用空格分隔开。即sed -n “$1,$ p”

  3. 脚本内加减运算的写法,if,for,while,case的写法

extra

接下来来到万恶的extra
其本身的难度可能也不能直接称之为高,但是我还是认为应该明确地表示充分利用hint的内容

因为hint中的内容,不仅太多,而且太重要,太必要!

对于第二问ln -s的超链接写法,这显然是回去看hint的,因为完全没有听说过

但是第一问不仅hint很晚才更新,另外还伪装成不用hint也能解决的问题,使很多同学花费了很多时间去用man来看已知指令的参数

其次,后置测试点依赖前置测试点。虽然他确实对于评测是更方便的,但是偏偏在第一问出现hint的缺失,从而影响到整个题目的得分,给人的体验还是不太好的。

genCode

第一问的主要任务是:
对于指定目录下的所有.sh文件,将其经过一些简单的sed文件处理后,以原名称(不含.sh).c的新名字存放在新的指定目录。

其他的都不难,最难的就在于怎么实现获取文件名与文件重命名

大多数同学都尝试过sed xxxxxx *.sy > *.c 然后意外的发现只生成了一个名为'*.c'的文件……

笔者找了找mv的man

mv是笔者知道的唯一的重命名指令

然后找到了-S, –suffix=[后缀名]这样的东西。

当然并没能实现功能。

后来助教说extra内容更新了。我看了眼题面,感觉没变,以为是第四第五题改了,就没在意。实际上发布的正是第一题的hint,能够实现对一个目录下所有文件都访问,并获取其文件名。

那么本题的考点就是awk指令
awk -F.并取$1来获得.sy前面的内容

selectCode

  1. 若存在则删除xxx

    考察的其实是rm -f强制执行(若不存在则自动忽视)

  2. ln -s (hint 超链接操作)

  3. gcc -I -o

selectData

本小问需要实现将所有的xx_yy.in与xx_yy.out文件根据参数进行复制。(xx与yy都是随机的)

若参数为all,则全部复制到指定目录
否则,仅复制参数_yy.in与参数_yy.out到指定目录

这里可以使用case语句

1
2
3
4
5
6
7
8
#!/bin/bash
mkdir dataSet
case $1 in
 all ) 
 	cp -r ./data ./dataSet;;
 * )
	cp ./data/$1* ./dataSet;;
esac

注意好格式。

未知

很遗憾,在我做完二三问,并发现有测试点依赖后,就全力研究第一问了。没能获得第四、五问的题目。同学们可以参考其它博客。

后记

不同于往年,今年的题目难度确实是大。大多数人都extra都喜提0分(或者未提交)
0
倘若第一问hint能够正常给出,本次lab的体验感应该还是不错的。

笔者给extra留了一整个小时还攻不下第一问,可见该hint的重要性()

现在想起自己实验报告里写OS多温和什么的,,,

OS的磨难才刚刚开始。

comments powered by Disqus
Easy Life and Easy Learning
使用 Hugo 构建
主题 StackJimmy 设计