OS_lab0


OS_lab0

OS lab0实验报告

思考题

Thinking 0.1


答:不一样,第三次cat Modified.txt未跟踪的文件还有Modified.txt

Thinking 0.2

add the file:

git add

stage the file:

git add

commit:

git commit

Thinking 0.3

1.代码文件 print.c 被错误删除时,应当使用什么命令将其恢复?

git checkout -- print.c

2.代码文件 print.c 被错误删除后,执行了 git rm print.c 命令,此时应当使用什么命令将其恢复?

git reset HEAD print.c

3.无关文件 hello.txt 已经被添加到暂存区时,如何在不删除此文件的前提下将其移出暂存区?

git rm --cached hello.txt

Thinking 0.4

第一次git log

commit a4b048ff4b097ea93d521d5362aa2cb3607c1d4d (HEAD -> master)
Author: 周靖宇 <21373405@buaa.edu.cn>
Date:   Sun Mar 5 17:48:30 2023 +0800

    3

commit 8472fe15302c73c61712e22cf2bffaa7dd1ccb0a
Author: 周靖宇 <21373405@buaa.edu.cn>
Date:   Sun Mar 5 17:48:06 2023 +0800

    2

commit 18bf9bbc2ea75dd8016db056fce7bac3228811b0
Author: 周靖宇 <21373405@buaa.edu.cn>
Date:   Sun Mar 5 17:47:23 2023 +0800

    1

git reset --hard HEAD^ + git log

commit 8472fe15302c73c61712e22cf2bffaa7dd1ccb0a (HEAD -> master)
Author: 周靖宇 <21373405@buaa.edu.cn>
Date:   Sun Mar 5 17:48:06 2023 +0800

    2

commit 18bf9bbc2ea75dd8016db056fce7bac3228811b0
Author: 周靖宇 <21373405@buaa.edu.cn>
Date:   Sun Mar 5 17:47:23 2023 +0800

    1

git reset --hard

commit 18bf9bbc2ea75dd8016db056fce7bac3228811b0 (HEAD -> master)
Author: 周靖宇 <21373405@buaa.edu.cn>
Date:   Sun Mar 5 17:47:23 2023 +0800

    1

git reset --hard

commit a4b048ff4b097ea93d521d5362aa2cb3607c1d4d (HEAD -> master)
Author: 周靖宇 <21373405@buaa.edu.cn>
Date:   Sun Mar 5 17:48:30 2023 +0800

    3

commit 8472fe15302c73c61712e22cf2bffaa7dd1ccb0a
Author: 周靖宇 <21373405@buaa.edu.cn>
Date:   Sun Mar 5 17:48:06 2023 +0800

    2

commit 18bf9bbc2ea75dd8016db056fce7bac3228811b0
Author: 周靖宇 <21373405@buaa.edu.cn>
Date:   Sun Mar 5 17:47:23 2023 +0800

    1

Thinking 0.5

界面中

first

output.txt中

third
forth

Thinking 0.6

这个我搞错了,学艺不精

运行效果

Shell Start...
set a = 1
set b = 2
set c = a+b
c = 3
save c to ./file1
save b to ./file2
save a to ./file3
save file1 file2 file3 to file4
save file4 to ./result

result的效果



1
3
2
1

command的效果

Thinking 0.7

command

echo 'echo Shell Start...' >test
echo 'echo set a = 1'>>test
echo 'a=1'>>test
echo 'echo set b = 2'>>test
echo 'b=2'>>test
echo 'echo set c = a+b'>>test
echo 'c=$[$a+$b]'>>test
echo 'echo c = $c'>>test
echo 'echo save c to ./file1'>>test
echo 'echo $c>file1'>>test
echo 'echo save b to ./file2'>>test
echo 'echo $b>file2'>>test
echo 'echo save a to ./file3'>>test
echo 'echo $a>file1'>>test
echo 'echo save file1 file2 file3 to file4'>>test
echo 'cat file1>file4'>>test
echo 'cat file2>>file4'>>test
echo 'cat file3>>file4'>>test
echo 'echo save file4 to ./result'>>test
echo 'cat file4>>result'>>test

test

echo Shell Start...
echo set a = 1
a=1
echo set b = 2
b=2
echo set c = a+b
c=$[$a+$b]
echo c = $c
echo save c to ./file1
echo $c>file1
echo save b to ./file2
echo $b>file2
echo save a to ./file3
echo $a>file1
echo save file1 file2 file3 to file4
cat file1>file4
cat file2>>file4
cat file3>>file4
echo save file4 to ./result
cat file4>>result

result

1
2
1
1
2
1

难点分析

Exercise 0.1

题目:

1、在Lab0 工作区的src 目录中,存在一个名为palindrome.c 的文件,使用刚刚学
过的工具打开palindrome.c,使用c 语言实现判断输入整数n(1 ≤ n ≤ 10000) 是否为回
文数的程序(输入输出部分已经完成)。通过stdin 每次只输入一个整数n,若这个数字为
回文数则输出Y,否则输出N。[注意:正读倒读相同的整数叫回文数]
2、在src 目录下,存在一个未补全的Makefile 文件,借助刚刚掌握的Makefile 知
识,将其补全,以实现通过make 命令触发src 目录下的palindrome.c 文件的编译链接
的功能,生成的可执行文件命名为palindrome。
3、在src/sh_test 目录下,有一个file 文件和hello_os.sh 文件。hello_os.sh
是一个未完成的脚本文档,请同学们借助shell 编程的知识,将其补完,以实现通过命令
bash hello_os.sh AAA BBB,在hello_os.sh 所处的目录新建一个名为BBB 的文件,其
内容为AAA 文件的第8、32、128、512、1024 行的内容提取(AAA 文件行数一定超过1024
行)。[注意:对于命令bash hello_os.sh AAA BBB,AAA 及BBB 可为任何合法文件的名
称,例如bash hello_os.sh file hello_os.c,若已有hello_os.c 文件,则将其原有
内容覆盖]
4、补全后的palindrome.c、Makefile、hello_os.sh 依次复制到路径dst/palindrome.c,
dst/Makefile, dst/sh_test/hello_os.sh [注意:文件名和路径必须与题目要求相同]
要求按照要求完成后,最终提交的文件树图示如下
|-- dst
2 | |-- Makefile
3 | |-- palindrome.c
4 | `-- sh_test
5 | `-- hello_os.sh
6 |-- src
7 |-- Makefile
8 |-- palindrome.c
9 `-- sh_test
10 |-- file
11 `-- hello_os.sh

难点分析

1.较为简单,只需要按照正常的C语言语法即可,算法上也没有什么难度
2.较为简单,可以参考pre练习中的make-exercise,核心代码是

compiled: palindrome.c
    gcc palindrome.c -o palindrome

3.难点是参数的传导以及提取特定行数,注意是覆盖文件,故使用>

sed -n '8p;32p;128p;512p;1024p' $1 > $2

4.只需要普通的mvcp命令即可

Exercise 0.2

题目

Exercise 0.2 Lab0 第二道练习题包括以下一题,如果你完成且正确,即可获得12 分。
1、在Lab0 工作区ray/sh_test1 目录中,含有100 个子目录file1~file100,还存
在一个名为changefile.sh 的文件,将其补完,以实现通过命令bash changefile.sh,
可以删除该目录内file71~file100 共计30 个子目录,将file41~file70 共计30 个子
目录重命名为newfile41~newfile70。[注意:评测时仅检测changefile.sh 的正确性]
要求按照要求完成后,最终提交的文件树图示如下(file 下标只显示1~12,newfile
下标只显示41~55)
难点分析

本题最难的部分应该是循环,但是循环的框架已经写好了,只需要往里面填充代码就可以了删除文件的代码

rm -r file$a

改名的代码

mv file$a newfile$a

循环的i++

let a=a+1

Exercise 0.3

题目

1、在Lab0 工作区的ray/sh_test2 目录下,存在一个未补全的search.sh 文件,
将其补完,以实现通过命令bash search.sh file int result,可以在当前目录下生成
result 文件,内容为file 文件含有int 字符串所在的行数,即若有多行含有int 字符
串需要全部输出。[注意:对于命令bash search.sh file int result,file 及result
可为任何合法文件名称,int 可为任何合法字符串,若已有result 文件,则将其原有内容
覆盖,匹配时大小写不忽略]
要求按照要求完成后,result 内显示样式如下(一个答案占一行):
难点分析

本题可能是对我来说最的一道题目了,主要是因为我对于sed,awk命令不是很熟悉,在网上查阅了一定的资料之后我使用awk指令做出了这道题

int=$2
awk '/int/{print NR}' $1 > $3

Exercise 0.4

题目

1、在Lab0 工作区的csc/code 目录下,存在fibo.c、main.c,其中fibo.c 有点小
问题,还有一个未补全的modify.sh 文件,将其补完,以实现通过命令bash modify.sh
fibo.c char int,可以将fibo.c 中所有的char 字符串更改为int 字符串。[注意:对
于命令bash modify.sh fibo.c char int,fibo.c 可为任何合法文件名,char 及int
可以是任何字符串,评测时评测modify.sh 的正确性,而不是检查修改后fibo.c 的正确
性]
2、Lab0 工作区的csc/code/fibo.c 成功更换字段后(bash modify.sh fibo.c char
int),现已有csc/Makefile 和csc/code/Makefile,补全两个Makefile 文件,要求在
csc 目录下通过命令make 可在csc/code 目录中生成fibo.o、main.o,在csc 目录中
生成可执行文件fibo,再输入命令make clean 后只删除两个.o 文件。[注意:不能修改
fibo.h 和main.c 文件中的内容,提交的文件中fibo.c 必须是修改后正确的fibo.c,
可执行文件fibo 作用是输入一个整数n(从stdin 输入n),可以输出斐波那契数列前n
项,每一项之间用空格分开。比如n=5,输出1 1 2 3 5]
要求成功使用脚本文件modify.sh 修改fibo.c,实现使用make 命令可以生成.o 文
件和可执行文件,再使用命令make clean 可以将.o 文件删除,但保留fibo 和.c 文件。
难点分析

第一小问主要是shell脚本关于字符串替换的撰写,核心代码是

pattern1=$2
pattern2=$3
sed -i "s/${pattern1}/${pattern2}/g" $1

第二问的主要任务是撰写blib.c和fibo.c以及Makefile的编写

客观来讲,论语法难度,两者难度都不大,但是在memcmp等函数编写时应当用unsigned char型变量,同时注意其他类似函数的编写

而关于Makefile的编写,需要将多个.o文件链接到一起

compile: ./code/fibo.c ./code/main.c ./code/Makefile ./include/fibo.h
        gcc -c -I ./include ./code/main.c -o ./code/main.o
        gcc -c -I ./include ./code/fibo.c -o ./code/fibo.o
        gcc ./code/fibo.o ./code/main.o -o fibo
clean: ./code/fibo.o ./code/main.o
        rm ./code/fibo.o ./code/main.o

实验体会

课下lab0

不足

在完成了Pre的三道练习之后,lab0的课下难度不算太高,但是我对于awk等指令的熟悉程度还是太差了导致进程其实并不快,对于Linux基本指令还是不熟悉

收获

学习到了shell脚本的编写,了解到了C语言编译的过程,对于MIPS的理解也更上一层楼总之还是要多花时间去感受Linux系统以及操作系统的一些逻辑

课上exam

这次exam有两道题,分别是Makefile的编写以及shell脚本的基础编写,难度很低,就算不熟悉基本指令看看指导书一小时以内也能写完

test1

Makefile的编写,要求实现通过gcctest.c文件的编译与执行,还有就是make clean删除可执行文件

compiled: test.c
	gcc test.c -o test
run: test
	./test
clean: test
	rm -f test

test2

要求新建一个mydir文件夹,并且对所有人授予读,写,执行的权限,文件的输出,stderr,mv,cp等等这些指令的编写,难度真的低,没什么好说的,唯一值得注意的的是chmod指令,在pre的学习过程中没怎么用过,但是指导书上也都有,查查书就行,还有就是shell脚本中的赋值问题,值得注意。

课上extra

课上extra的难度也不大,和exam加起来完全可以一小时二十分钟内写完,主要是对mos日志的某些特定信息的提取删除,主要考察了grep tail diff等指令的常见操作以及对于shell脚本一些基础概念的理解下面是核心代码

grep -E "WARN|ERROR" $1 > bug.txt
tail -n -5 $1
grep -E "$3" $1 > $3.txt
if ($(diff $1 $3))
	then
		echo same
	else
		echo different
	fi

上机感受

就目前来讲,OS也只学了一些Make,Linux,shell的常见操作,复习了MIPS和C语言的一些基础特性,还没有上强度,通过lab0还是容易的,但是切忌掉以轻心,希望可以学好OS,orz


文章作者: UyJZ
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 UyJZ !
  目录